LeetCode-53:Maximum Subarray (和最大的连续子数组)
来源:互联网 发布:描述设置数据有效性 编辑:程序博客网 时间:2024/05/17 21:17
Question
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
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.
问题解析:
在给定数组中找到和最大的连续子数组,子数组至少包含一个元素。
Answer
Solution 1:
DP解决。
- 首先以本题的例子解释一下:已知数组的前k个元素的和最大子的序列的和为
maxSub
(每次均比较记录),以及前k个数组的临时和sum
。如果添加了第k+1个元素,由于题目中说明是连续子序列这个限制,所以如果k+1这个元素之前的和,也就是sum
是小于0的,那么前面的和对于增加的k+1
这个元素从而去组成最大子序列是没有贡献的,所以可以直接将sum
置0。 - 如题目中的数组:[-2,1,-3,4,-1,2,1,-5,4],就以前两个元素[-2,1]为例,sum = -2 < 0 ,对于数字
1
来说,加前面的数组-2
只会减小它,所以直接置sum=0
,新的sum=0+1=1
;对[-2,1,-3,4]来说,子数组[-2,1,-3]经过计算后的临时sum = -2 < 0,对于数字4
来说,前面的和只会减小它,所以直接置sum=0
,新的sum=0+4=4
; - 注意,只要sum不减到负数,中间出现小于0的元素是没关系的,sum仍然可以继续累加。
- 算法:利用动态规划思想,已知0,..,k的最大和以后,0,…k+1的最大和为:
1)若sum[k]>=0,sum[k+1]=sum[k]+A[k+1];
2)若sum[k]<0,sum[k+1]=A[k+1]。
class Solution { public int maxSubArray(int[] nums) { int maxSoFar = nums[0], maxEndingHere = nums[0]; for (int i = 1; i < nums.length; ++i){ maxEndingHere = Math.max(maxEndingHere+nums[i], nums[i]); maxSoFar = Math.max(maxSoFar, maxEndingHere); } return maxSoFar; }}
- 时间复杂度:O(n),空间复杂度:O(1)
public int maxSubArray(int[] A) { int n = A.length; int[] dp = new int[n];//dp[i] means the maximum subarray ending with A[i]; dp[0] = A[0]; int max = dp[0]; for(int i = 1; i < n; i++){ dp[i] = A[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0); max = Math.max(max, dp[i]); } return max;}
- 时间复杂度:O(n),空间复杂度:O(n)
Solution 2:
贪心算法。
- 下面的思想其实和DP是相似的。其从头开始一直保持将数组加入进来,直到
sum < 0
,则将sum
置为0,ans
一直保存最大的和。
/*Idea is very simple. Basically, keep adding each integer to the sequence until the sum drops below 0. If sum is negative, then should reset the sequence.*/class Solution { public int maxSubArray(int A[], int n) { int ans=A[0],i,j,sum=0; for(i=0;i<n;i++){ sum+=A[i]; ans=max(sum,ans); sum=max(sum,0); } return ans; }}
- 时间复杂度:O(n),空间复杂度:O(1)
阅读全文
0 0
- leetcode-53 Maximum Subarray 连续子数组的最大和
- [LeetCode] Maximum Subarray 求连续子数组的最大和
- LeetCode 53. Maximum Subarray--连续子数组的最大和
- Maximum Subarray 最大子数组和(连续)@LeetCode
- LeetCode-53:Maximum Subarray (和最大的连续子数组)
- LeetCode OJ-53.Maximum Subarray(最大连续子数组和)
- LeetCode | Maximum Subarray(连续最大子数组)
- Maximum Subarray-最大连续子数组和
- [leetcode 53] Maximum Subarray----最大子数组的和
- leetcode | Maximum Subarray 最大连续子序列的和
- 53.Maximum Subarray&连续子数组的最大和
- leetcode:Maximum Subarray(最大的连续子数组) 【面试算法】
- 【LeetCode】152. Maximum Product Subarray最大连续子数组乘积
- LeetCode 152. Maximum Product Subarray--连续子数组最大乘积
- Leetcode#53. Maximum Subarray(连续子序列的最大和)
- [Leetcode-53]Maximum Subarray 最大子数组和
- LeetCode: -Dynamic Programming-Maximum Subarray[53]-子数组最大和
- 【LeetCode】Maximum Subarray (最大连续子序列和)
- 扫雷
- 领悟代码的魅力
- 牛客网错题集锦5
- Python 学习笔记 -处理excel
- 译-设计模式-结构模式之Proxy
- LeetCode-53:Maximum Subarray (和最大的连续子数组)
- 关于先锋参数文件.p中默认加减速度
- test
- JS的简易时钟
- vim查找替换
- 仿函数function和lambda表达式的使用以及cocos2dx中CREATE_FUN()的原理
- Integer.parseInt("") Integer.valueOf("")和new Integer("")之间的区别
- Python获取并输出当前日期时间
- Handlebars.js 模板引擎