53. 最大子序和
题目描述查看:https://leetcode-cn.com/problems/maximum-subarray/
题目的意思是,给定一个数组,从这个数组里找子序列的最大值。
-
思路
可以把整个问题做个拆分,拆分成求前n-1个序列的最大子序列的值。
把问题规模缩小到n=4,数列为[-2,1,-3,4]
序列的所有可能如下:
以-2结尾序列,{-2} max=-2
以1结尾序列,{-2,1},{1} max=1
以-3结尾序列,{-2,1,-3},{1,-3},{-3} max=-2
以4结尾序列,{-2,1,-3,4},{1,-3,4},{-3,4},{4} max=4
最后的结果就是比较以第i个数结尾的序列中,哪个最大,得到{4}。
这样就找到了子问题,原问题转换为以nums[n]结尾的序列的最大子序列。
设dp[i]为以n结尾的序列的最大子序列。
初始条件dp[0] = nums[0]
if(dp[i-1] > 0){ dp[i] = nums[i] + dp[i-1]; }else{ dp[i] = nums[i]; }
-
代码
1 public int maxSubArray(int[] nums) { 2 int dp[] = new int[nums.length]; 3 dp[0] = nums[0]; 4 for (int i = 1; i < dp.length; i++) { 5 if(dp[i-1] > 0){ 6 dp[i] = nums[i] + dp[i-1]; 7 }else{ 8 dp[i] = nums[i]; 9 } 10 } 11 int max = dp[0]; 12 for (int x: dp 13 ) { 14 max = Math.max(max,x); 15 } 16 return max; 17 }