【LeetCode】53. Maximum Subarray
2016-04-07 19:27
471 查看
53. Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array
the contiguous subarray
【分析】
对于此题,一个非常直观的解法就是遍历所有的子数组,采用两重循环即可完成,但对于N个元素的数组,其组数为N(N+1)/2,算法时间复杂度为O(N2).这显然是一种“暴力”解法。以题目给出的例子,我们可以简单分析一下,找出其中规律:
对于
【解法及注释】
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array
[−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray
[4,−1,2,1]has the largest sum =
6.
【分析】
对于此题,一个非常直观的解法就是遍历所有的子数组,采用两重循环即可完成,但对于N个元素的数组,其组数为N(N+1)/2,算法时间复杂度为O(N2).这显然是一种“暴力”解法。以题目给出的例子,我们可以简单分析一下,找出其中规律:
对于
[−2,1,−3,4,−1,2,1,−5,4],sum初始化sum=nums[0]=-2;sum+nums[1]<nums[1],求和的结果比当前数组元素还要小,这表明前面求和构成sum的的子数组已经没有意义,将它们抛弃,此时sum=nums[1],再下一步,sum+nums[2]<sum,这时候需要将它和最大值比较,如果当前的sum较大则保存,继续累加,sum=-2,再下一步,sum+nums[3]=2<nums[3]=4,丢弃前面构成的sum,sum=nums[3]=4;以此类推,一次遍历便可以求取最大子数组的和,时间复杂度降为O(N)。
【解法及注释】
class Solution { public: int maxSubArray(vector<int>& nums) { int sum,maxSum; if(nums.empty())return 0;//如果输入为空,则返回0 sum=maxSum=nums[0];//初始化求和变量和最大子数组和变量 for(int i=1;i<nums.size();i++) { if(nums[i]>sum+nums[i])//如果当前数组元素大于求和,则抛弃之前元素 { sum=nums[i]; if(sum>maxSum)maxSum=sum;//判断后保存最大值 } else { if(sum>sum+nums[i]&&sum>maxSum)//如果求和数组开始减小,则判断、保存当前值 maxSum=sum; sum+=nums[i]; } } if(sum>maxSum)maxSum=sum;//返回最大累加结果 return maxSum; } };
相关文章推荐
- 数组定和元素求解探究
- 虚幻4 Function Library
- 学习进度表
- LA 4329 Ping pong
- 并查集 水题
- 并查集 水题
- Disunity_V0.5.0 提取Unity生成的Apk的资源
- bzoj 2818: Gcd
- JavaScript之调用函数的方式
- java 访问权限修饰符理解
- 去除list集合中重复项的几种方法
- 线段树入门HDU_1754
- 剑指offer-面试题3.二维数组中的查找
- Oracle Merge into [转] [ http://www.cnblogs.com/dongsheng/p/4384754.html]
- Spring+SpringMVC+MyBatis
- DE1-SOC开发之路--安装ubantu系统
- form表单提交提示对象不支持此属性或方法
- JavaScript之函数实例属性和类属性
- AlertDialog 自定义布局点击按钮消失方法
- 线段树入门HDU_1754