最大子数组问题
来源:互联网 发布:淘宝店铺公告怎么写 编辑:程序博客网 时间:2024/06/05 08:50
给出一个数组,要求出最大非空连续子数组,使得字数组的和最大。
参照《算法导论》,下面给出递归和非递归版本的C++实现。
template<typename T>vector<T> FindMaxCrossSubArray(const vector<T>& A, int low, int mid, int high){ T left_sum = -99999999; T sum=0; int max_left=mid; for(int i=mid; i>=low; --i){ sum+=A[i]; if(sum>left_sum){ left_sum=sum; max_left=i; } } T right_sum = -99999999; sum=0; int max_right=mid+1; for(int i=mid+1; i<=high; ++i){ sum+=A[i]; if(sum>right_sum){ right_sum=sum; max_right=i; } } vector<T> rst = {max_left, max_right, left_sum+right_sum}; return rst;}template<typename T>vector<T> FindMaxSubArray_reg(const vector<T>& A, int low, int high){ if(low==high){ vector<T> rst={low, high, A[low]}; return rst; } else{ int mid = (low+high)/2; vector<T> rst_left = FindMaxSubArray_reg(A, low, mid); vector<T> rst_right = FindMaxSubArray_reg(A, mid+1, high); vector<T> rst_cross = FindMaxCrossSubArray(A, low, mid, high); if(rst_left[2]>=rst_right[2]&&rst_left[2]>=rst_cross[2]) return rst_left; else if(rst_right[2]>=rst_left[2]&&rst_right[2]>=rst_cross[2]) return rst_right; else return rst_cross; }}template<typename T>vector<T> FindMaxSubArray(const vector<T>& A){ vector<T> tmp={0,0,A[0]}; for(int i=0; i<A.size()-1; ++i){ T left_sum=-9999999; T sum=0; int max_left=i; for(int j=i+1; j>=0; --j){ sum += A[j]; if(sum>left_sum){ left_sum=sum; max_left=j; } } if(tmp[2]<left_sum){ tmp[0]=max_left; tmp[1]=i+1; tmp[2]=left_sum; } } return tmp;}
阅读全文
0 0
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 最大子数组问题
- 设置excel不自动添加超链接
- Javascript闭包——懂不懂由你,反正我是懂了
- 面试题66. 矩阵中的路径
- 数组和ArrayList的区别
- ubuntu 下面安装protocol_buf
- 最大子数组问题
- 来说说(Proxy) 代理模式
- HTML有哪些meta标签
- 第九章:接口
- [C++ Primer CH03]第3章 字符串、向量和数组(笔记)
- oracle 创建用户使用的语句
- 基于Spring+SpringMVC+MyBatis+Websocket的网页聊天尝试
- 坚持不懈,直到成功-I will persist. I will win.
- redis学习日志九(有序集合(zset)的常用命令)