$$ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Self-defined math definitions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Math symbol commands \newcommand{\intd}{\,{\rm d}} % Symbol 'd' used in integration, such as 'dx' \newcommand{\diff}{{\rm d}} % Symbol 'd' used in differentiation ... $$

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     }

 

posted @ 2020-04-05 15:52  V丶vvv  阅读(323)  评论(0编辑  收藏  举报