剑指 Offer 42 连续子数组的最大和
解题思路
首先,用递归的思路进行思考:取数组 arr 上的一个索引位置 index,假设这是我们所求的子数组的最后一位,那么这个子数组的和取决于两个要素:
- arr[index] 的值
- 子数组前几个数字的和
那么,不难看出,这一子序列的最大值为:
| 条件 | 值 |
|---|---|
| 子数组前几个数字的和小于 0 | arr[index] 的值 |
| 子数组前几个数字的和大于 0 | arr[index] 的值 + 子数组前几个数字的和 |
设以 arr[index] 作为结尾的子序列的和为 sum[index],那么以上表格可以写为函数:
| sum[index] = | |
|---|---|
| arr[index] | sum[index - 1] < 0 |
| arr[index] + sum[index - 1] | sum[index - 1] >= 0 |
并拥有初始条件:
sum[0] = arr[0]
代码
class Solution {
public int maxSubArray(int[] nums) {
int N = nums.length;
int[] sum = new int[N];
sum[0] = nums[0];
int result = sum[0];
for (int i = 1; i < N; i ++) {
if (sum[i - 1] < 0) {
sum[i] = nums[i];
} else {
sum[i] = sum[i - 1] + nums[i];
}
result = Math.max(sum[i], result);
}
return result;
}
}
浙公网安备 33010602011771号