欢迎访问原文所在博客:https://52heartz.top/articles/leetcode-53-maximum-subarray/
解答1[Java]:
class Solution {
public int maxSubArray(int[] nums) {
if (nums.length <= 0)
return 0;
int[] dp = new int[nums.length];
dp[0] = nums[0];
int max = dp[0];
for (int i = 1; i < nums.length; i++) {
dp[i] = Math.max(nums[i], nums[i] + dp[i - 1]);
max = Math.max(max, dp[i]);
max = dp[i] > max ? dp[i] : max;
}
return max;
}
}
思路
动态规划。
dp[i]
中存储的是 i
之前的最大的子序列和。
解答2[Java]:
class Solution {
public int maxSubArray(int[] nums) {
int maxSum = nums[0];
int curSum = 0;
for (int n : nums) {
curSum += n;
if (curSum > maxSum) {
maxSum = curSum;
}
if (curSum < 0) {
curSum = 0;
}
}
return maxSum;
}
}
思路
时间复杂度降到了 O ( 1 ) O(1) O(1)。
一直加,用 curSum
表示截至目前的最大正子序和。