寻找最大和子数组 Find maximum subarrray
2014-05-08 14:09
411 查看
问题描述:输入是一个大小为n的整型数组,要求输出数组的任何连续子数组中的最大值(即该子数组的各个元素之和是最大的)。
例如:输入的数组为array[16] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};输出最大连续子数组和为array[7...10]:43
详细的分析可以参见《算法导论》英文版 Divide-and-conquer一章。里面有详细的伪代码分析。或者参看/article/4834205.html中的算法3。两者的思路是一样的。
例如:输入的数组为array[16] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};输出最大连续子数组和为array[7...10]:43
详细的分析可以参见《算法导论》英文版 Divide-and-conquer一章。里面有详细的伪代码分析。或者参看/article/4834205.html中的算法3。两者的思路是一样的。
/*============================================================================= # # FileName: MaximumSubarray.cpp # Desc: 寻找最小子数组。《算法导论》——Divide-and-conquer # # Author: yulu # Email: 187373778@qq.com # # Created: 2014-05-07 23:51:00 # Version: 0.0.1 # History: # 0.0.1 | yulu | 2014-05-07 23:00:00 | initialization # =============================================================================*/ #include <iostream> using namespace std; void cross_mid(int A[],int low,int mid,int high,int *pos_begin,int *pos_end,int *sum) { int left_max=A[mid]; int right_max=A[mid+1]; int temp_sum=0; for(int i=mid;i>=low;i--) { temp_sum+=A[i]; if(temp_sum>=left_max) //找出左半边的最大子数组 { *pos_begin=i; left_max=temp_sum; } } temp_sum=0; for(int j=mid+1;j<=high;j++) { temp_sum+=A[j]; if(temp_sum>=right_max) //找出右半边最大子数组 { *pos_end=j; right_max=temp_sum; } } *sum=left_max+right_max; //合并 return; } int find_maximum_subarray(int A[],int low,int high,int *pos_begin,int *pos_end,int *sum) { if(low>high)//参数异常 return 0; else if(low==high) //只有一个元素 { *pos_begin=*pos_end=low; *sum=A[low]; } else { int mid=(low+high)/2; //子数组在A的左半边 int left_begin,left_end,left_sum; find_maximum_subarray(A,low,mid,&left_begin,&left_end,&left_sum); //子数组在A的右半边 int right_begin,right_end,right_sum; find_maximum_subarray(A,mid+1,high,&right_begin,&right_end,&right_sum); //子数组跨越中点 int cross_begin,cross_end,cross_sum; cross_mid(A,low,mid,high,&cross_begin,&cross_end,&cross_sum); //比较以上三种子数组,哪一个的和最大 if(left_sum>=right_sum && left_sum>=cross_sum) { *sum=left_sum; *pos_begin=left_begin; *pos_end=left_end; } else if(right_sum>=left_sum && right_sum>=cross_sum) { *sum=right_sum; *pos_begin=right_begin; *pos_end=right_end; } else { *sum=cross_sum; *pos_begin=cross_begin; *pos_end=cross_end; } } } int main() { int A[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7}; int sub_begin,sub_end,sum; int low=0,high=15; find_maximum_subarray(A,low,high,&sub_begin,&sub_end,&sum); cout<<"The maximum subarray sum is: "<<sum<<endl; cout<<sub_begin<<" "<<sub_end<<endl; return 0; }
相关文章推荐
- 2.10 用最少次数寻找数组中的最大值和最小值[find min max of array]
- Maximum Gap 寻找数组中排序后相邻两个数的最大差值,桶排序,O(n)
- [LeetCode] Maximum Average Subarray II 子数组的最大平均值之二
- 算法导论--寻找最大子数组
- 寻找数组中的最大值和最小值
- 算法训练 寻找数组中最大值
- 【编程习题★★★☆☆】寻找数组中元素间最大差值
- 寻找数组中最大值和最小值—分治算法
- 小白进阶之寻找最大子数组问题
- [Leetcode,python] Find All Numbers Disappeared in an Array 寻找数组中消失的数字
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
- 树状数组快速寻找getsum(i) < k的最大的 i
- 【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大
- 编程之美--寻找数组中的最大值和最小值
- 寻找数组中的最大值和最小值
- 在数组中,寻找一个最大递增子数列
- 编程之美3:寻找数组中的最大值和最小值以及最大值和次大值
- 编程之美2.10 寻找数组中的最大值和最小值
- 编程之美——寻找数组中最大的K个数
- 【编程之美】读书笔记:寻找数组中的最大值和最小值