题目:

题解
1、前缀和算法
解题思路:所有 当前的前缀和 - 前面出现过的最小前缀和 的最大值(当前的前缀和去掉之前最小的前缀和,反而会变大,相当于之前的是累赘)
复杂度分析:
- 时间复杂度O(n)
- 空间复杂度O(1)
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// 前缀和算法
public class Solution {
public int maxSubArray(int[] nums) {
int min = 0;
int max = Integer.MIN_VALUE;
int maxNums = 0;
for (int i = 0; i < nums.length; i++) {
maxNums += nums[i];
// 所有 当前的前缀和 - 前面出现过的最小前缀和 的最大值
// 当前的前缀和去掉之前最小的前缀和,反而会变大,相当于之前的是累赘
max = Math.max(max,maxNums - min);
min = Math.min(min,maxNums);
}
return max;
}
}
2、动态规划法
解题思路:
- 第i+1个数,前i个数之和如果是正数,那么第i+1个数加上前i个数就会变大;如果是负数,则反转,那么前i+1个数就是nums[i+1]

复杂度分析:
- 时间复杂度O(n)
- 空间复杂度O(n):状态数组的长度为N
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13// 动态规划法
class Solution2 {
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]= Math.max(dp[i-1] + nums[i],nums[i]);
max = Math.max(max,dp[i]);
}
return max;
}
}滚动变量优化
复杂度分析:
- 时间复杂度O(n)
- 空间复杂度O(1)
代码:
1
2
3
4
5
6
7
8
9
10
11
12// 动态规划法(滚动变量优化)
class Solution3 {
public int maxSubArray(int[] nums) {
int dp = 0;
int max = nums[0];
for (int num : nums) {
dp = Math.max(dp + num,num);
max = Math.max(max,dp);
}
return max;
}
}