最大连续子数组
来源:互联网 发布:兄弟连nginx视频教程 编辑:程序博客网 时间:2024/06/05 05:53
输入一个数组,输出最大连续子数组区间,以及最大连续子数组和的值
#include <iostream>#include <limits>using namespace std;const int MIN=1<<(sizeof(int)*8-1); // int MIN=numeric_limits<int>::min();const int MAX=-(1<<(sizeof(int)*8-1)+1); // int MAX=numeric_limits<int>::max();struct MAX_ARRAY{ int left; int right; int sum;}LEFT,RIGHT,MIDDLE;MAX_ARRAY FIND_MAX_CROSSING_SUBARRAY(int a[],int left,int mid,int right){ int left_sum=MIN,right_sum=MIN; int sum=0; int max_left=-1,max_right=-1; for(int i=mid;i>=left;i--) { sum+=a[i]; if(left_sum<=sum) { left_sum=sum; max_left=i; } } sum=0; for(int i=mid+1;i<=right;i++) { sum+=a[i]; if(right_sum<=sum) { right_sum=sum; max_right=i; } } MIDDLE.left=max_left; MIDDLE.right=max_right; MIDDLE.sum=left_sum+right_sum; return MIDDLE;}MAX_ARRAY FIND_MAX_SUBARAY(int a[],int left,int right){ if(left==right) { LEFT.left=left; LEFT.right=right; LEFT.sum=a[left]; return LEFT; } else { int mid=(left+right)/2; LEFT=FIND_MAX_SUBARAY(a,left,mid); RIGHT=FIND_MAX_SUBARAY(a,mid+1,right); MIDDLE=FIND_MAX_CROSSING_SUBARRAY(a,left,mid,right); if(LEFT.sum > RIGHT.sum && LEFT.sum > MIDDLE.sum) return LEFT; else if(RIGHT.sum > LEFT.sum && RIGHT.sum > MIDDLE.sum) return RIGHT; else return MIDDLE; }}int main(int argc, char *argv[]){// int a[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7}; int n; cin>>n; int a[n]; for(int i=0;i<n;i++) cin>>a[i]; MAX_ARRAY test; test=FIND_MAX_SUBARAY(a,0,n-1); cout<<test.left<<" "<<test.right<<" "<<test.sum<<endl; return 0;}
阅读全文
0 0
- 最大连续子数组
- 最大连续子数组
- 最大连续子数组
- 最大连续子数组
- 最大连续子数组
- 最大连续子数组
- 最大连续子数组
- 最大连续子数组
- 连续子数组最大和
- 连续最大子数组和
- 连续子数组最大和
- 最大连续子数组和
- 连续子数组最大和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- IMWeb前端秋招训练营--前端作业7
- canvas上纯JS实现可滑动时间刻度轴
- POJ 3176 Cow Bowling (数字三角形DP)
- java环境搭建
- Java_基础—统计字符串中每个字符出现的次数
- 最大连续子数组
- 搬砖中的小事之代码(八)--客户编码6位数的随机串的生成和登记时间的生成
- POJ 3414 Pots(bfs)
- 对话框最小尺寸的限制
- ubuntu 14.04 安装有道词典
- JAVA 面试题 输出100以内的所有素数
- WC命令详解
- Git忽略规则及.gitignore规则不生效的解决办法
- 面试题67:机器人的运动范围