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

题目说明

  • 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

    要求时间复杂度为O(n)。

  • 提示:

    • 1 <= arr.length <= 10^5
    • -100 <= arr[i] <= 100

示例

示例1:

1
2
3
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

笔者理解

此题是一道动态规划算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,发现此题的动态规划里面好像带一点的贪心,用dp数组来模拟连接子串的过程,如果前面的子串的和大于0我就继续连接,否则我就重新开始子串连接,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
/*
* 动态规划
*/
public int maxSubArray(int[] nums) {
int n = nums.length;

// 用dp数组来记录当前的连接串
int[] dp = new int [n];
dp[0] = nums[0];
int max = dp[0];

for (int i = 1; i < n; i++) {
// 如果前面的子串和大于零,说明前面的子串是可连接的,否则,从当前元素重新开始
dp[i] = Math.max(0, dp[i - 1]) + nums[i];
// 记录子串的最大和
max = Math.max(dp[i], max);
}

return max;
}
}

时间空间效率都还行,可见此解法还比较适合此题;

image.png

总结

本题是今天的每日一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。