题目:
题解一:贪心
贪心策略:如果前面的连续和为负数,应该立即舍弃,从当前位置从新计算(因为负数会"拖累"当前位置的连续和)
public int maxSubArray(int[] nums) {
int count = 0;
int result = Integer.MIN_VALUE;
for (int num : nums) {
count = count + num;
if (count > result) {
result = count;
}
if (count < 0) {
count = 0;
}
}
return result;
}
时间复杂度:O(n)
题解二:动态规划
dp方程:dp[i] = max(dp[i-1], nums[i]);
dp 方程中最大值就是最终答案。
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
int result = nums[0];
dp[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);
result = Math.max(result, dp[i]);
}
return result;
}
时间复杂度:O(n)