标签:解答 要求 == 复杂 array 时间 时间复杂度 else 忽略
题目:
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为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 }
标签:解答 要求 == 复杂 array 时间 时间复杂度 else 忽略
原文地址:https://www.cnblogs.com/heaveneleven/p/12804194.html