力扣 53. 最大子序和

题目说明

  • 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

  • 提示:

    • 1 <= nums.length <= 3 * 10^4
    • -10^5 <= nums[i] <= 10^5

示例

示例 1:

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

示例 2:

1
2
输入:nums = [1]
输出:1

示例 3:

1
2
输入:nums = [0]
输出:0

示例 4:

1
2
输入:nums = [-1]
输出:-1

示例 5:

1
2
输入:nums = [-100000]
输出:-100000

笔者理解

此题是一道数组算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,发现此题考察的是比较简单的动态规划思想,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
/*
* 动态规划
*/
public int maxSubArray(int[] nums) {
int n = nums.length;
// 转移数组
int[] dp = new int [n + 1];
// 用来保存转移的时候遇到的最大值
int result = -Integer.MAX_VALUE;

for (int i = 1; i <= n; i++) {
// 我认定前面的连续子数组总和大于0就继续链接,否则就丢弃
dp[i] = nums[i - 1] + Math.max(0, dp[i - 1]);
result = Math.max(result, dp[i]);
}

return result;
}
}

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

image-20210806184127691

总结

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