Description
https://leetcode.com/problems/maximum-subarray/
求连续子数组的最大和
Solving Ideas
动态规划:
State:
dp[i]
: 以a[i]
为结尾的子数组的最大和
Initial State:
dp[0] = a[0]
State Transition:
dp[i] = max(a[i], dp[i - 1] + a[i]); (i >= 1)
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)
Solution
class Solution {
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
int res = dp[0];
for (int i = 1; i < nums.length; i++) {
dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]);
res = Math.max(res, dp[i]);
}
return res;
}
}
优化,使空间复杂度降到 O ( 1 ) O(1) O(1)
public class MaximumSubarray {
public int maxSubArray(int[] nums) {
int res = nums[0], sum = nums[0];
for (int i = 1; i < nums.length; i++) {
sum = (sum < 0) ? nums[i] : sum + nums[i];
res = Math.max(res, sum);
}
return res;
}
}