最大连续子数组和
来源:互联网 发布:extensionloaded php 编辑:程序博客网 时间:2024/06/07 07:33
题目描述:给定一个数组,数组里可能有正数,负数,0,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个一个和。求所有子数组和的最大值。例如,如果输入数组为,和的最大子数组为{1,-2,3,10,-4,7,2,-5},那么输出为该子数组的和18
解法一:蛮力枚举法(时间复杂度:O(N*N*N))
用三个for循环三层遍历,求出数组中每一个子数组的和,最终求出这些子数组和中最大的一个值。
#include<iostream>using namespace std;int MaxSubArray(int array[], int n){ int maxSum = array[0]; //全是负数的情况,返回最大值 int curSum = 0; for(int i=0; i<n; ++i) { for(int j=i; j<n; ++j) { for(int k=i; k<=j; ++k) curSum += array[k]; if(curSum > maxSum) maxSum = curSum; //这里要注意清零,否则计算的是所有子数组的和 curSum = 0; } } return maxSum;}int main(){ int array[] = {1,-2,3,10,-4,7,2,-5}; int ret1 = MaxSubArray(array, sizeof(array)/sizeof(array[0])); cout<<ret1<<endl; system("pause"); return 0;}
解法二:动态规划:从前往后只扫描一遍数组,时间复杂度为O(n)
令curSum是以当前元素结尾的最大连续子数组的和,maxSum是全局的最大子数组的和,当往后扫描时,对第j个元素由两种选择,要么放入前面的找到的子数组,要么作为一个新子数组的第一个元素:
如果curSum>0,则令curSum加上array[j];如果curSum<0,则curSum被置为当前元素,即curSum = array[j];
int MaxSubArray2(int* array, int n){ int curSum = 0; int maxSum = array[0]; //数组全为负数的情况,返回最大数 for(int j=0; j<n; ++j) { if(curSum >= 0) curSum += array[j]; else curSum = array[j]; if(curSum > maxSum) maxSum = curSum; } return maxSum;}int main(){ int array[] = {1,-2,3,10,-4,7,2,-5}; int ret2 = MaxSubArray2(array, sizeof(array)/sizeof(array[0])); cout<<ret2<<endl; system("pause"); return 0;}
阅读全文
0 0
- 连续子数组最大和
- 连续最大子数组和
- 连续子数组最大和
- 最大连续子数组和
- 连续子数组最大和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和。
- 最大子数组和(连续)
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- apue翻译错误
- Spring-3
- Openwrt系统中shell脚本获取配置文件信息解读
- 八爪鱼采集数据简单实例
- SwingUtilities的invokeLater和invokeAndWait
- 最大连续子数组和
- Android 状态栏那些小坑?
- 微信开发设置菜单
- 有界、无界队列对ThreadPoolExcutor执行的影响
- 第11周作业1(LeetCode31)
- Web项目学习总结
- 走近人脸检测:从VJ到深度学习(上)
- POJ 1250 Tanning Salon 笔记
- 参考书籍