https://leetcode.cn/problems/maximum-subarray/
法一
- 子数组以 i 位置结尾
- 可能性1) [i] 自己
- 可能性 2) 不止[i]
- [ i ] + dp[i -1]
优化public int maxSubArray(int[] nums) {int max = nums[0];int N = nums.length;// dp[i] : 数组以i位置结尾时的最大结果是多少int[] dp = new int[N];dp[0] = nums[0];for (int i = 1; i < N; i++) {int p1 = nums[i];int p2 = nums[i] + dp[i - 1];dp[i] = Math.max(p1, p2);max = Math.max(max, dp[i]);}return max;}
public int maxSubArray1(int[] nums) {int max = nums[0];int N = nums.length;int prev = nums[0];for (int i = 1; i < N; i++) {int p1 = nums[i];int p2 = nums[i] + prev;prev = Math.max(p1, p2);max = Math.max(max, prev);}return max;}
法二
```java public int maxSubArray2(int[] nums) { int max = Integer.MIN_VALUE; int cur = 0; for (int i = 0; i < nums.length; i++) { cur += nums[i]; max = Math.max(max, cur); cur = cur < 0 ? 0 : cur; } return max; }
```
