剑指 Offer 42 连续子数组的最大和

题目出处

解题思路

首先,用递归的思路进行思考:取数组 arr 上的一个索引位置 index,假设这是我们所求的子数组的最后一位,那么这个子数组的和取决于两个要素:

  1. arr[index] 的值
  2. 子数组前几个数字的和

那么,不难看出,这一子序列的最大值为:

条件 值
子数组前几个数字的和小于 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;
    }
}
posted @ 2021-07-25 21:35  寻落英以得度  阅读(58)  评论(0)    收藏  举报