连续子数组的最大和

题目:

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

 

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
 

提示:

1 <= arr.length <= 10^5
-100 <= arr[i] <= 100

 

解答:

窗口滑动问题,动态规划解决,设dp[i]为连续整数中最后一个整数为nums[i],所能够组成的最大和;则回退一步,如果dp[i]的前一个dp[i-1]<0,则dp[i]可以忽略掉前面的了,从nums[i]开始,否则就可以继续利用dp[i-1];所以有状态转移方程:dp[i] = dp[i-1] < 0 ? nums[i] : dp[i-1] + nums[i];边界条件:dp[0]=nums[0];

 1 class Solution {
 2     public int maxSubArray(int[] nums) {
 3         if(nums == null || nums.length == 1){
 4             return nums[0];
 5         }
 6         int len = nums.length;
 7         int [] dp = new int[len];
 8         dp[0] = nums[0];
 9         int max = dp[0];
10         for(int i=1;i<len;i++){
11             if(dp[i-1]<0){
12                 dp[i] = nums[i];
13             }else{
14                 dp[i] = dp[i-1] + nums[i];
15             }
16             max = Math.max(max, dp[i]);
17         }
18         return max;
19     }
20 }

 

posted @ 2020-04-29 19:40  heaven夏  阅读(192)  评论(0编辑  收藏  举报