给定整数数组nums,找到具备最大总和并返回其总和的连续子数组(包含至少一个数字)。 Example:数组
Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6.
app
Follow up: If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.ide
这是一道很是典型的动态规划题,为了求整个字符串最大的子序列和,咱们将先求较小的字符串的最大子序列和。这里咱们从后向前、从前向后计算都是能够的。在从前向后计算的方法中,咱们将第i个元素以前最大的子序列和存入一个一维数组dp中,对第i+1个元素来讲,它的值取决于dp[i],若是dp[i]是负数,那就没有必要加上它,由于这只会拖累子序列的最大和。若是是正数就加上它。最后咱们再讲第i+1个元素自身加进去,就获得了第i+1个元素以前最大的子序列和。spa
时间复杂度 O(n) 空间复杂度 O(n)code
class Solution {
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
int max = nums[0];
dp[0] = nums[0];
for(int i = 1; i < nums.length; i ++) {
dp[i] = dp[i - 1] > 0 ? dp[i - 1] + nums[i] : nums[i];
max = Math.max(dp[i], max);
}
return max;
}
}
复制代码