LeetCode 53. 最大子数组和

题目描述

🔥 53. 最大子数组和

image-20230305160814847

思路分析

我们可以使用动态规划来解决这个问题。设 cur 为以 nums[i] 结尾的最大子数组和。我们可以通过以下步骤来更新 cur

  1. 如果 cur + nums[i] 大于 nums[i],则更新 curcur + nums[i],表示我们选择继续加上当前元素。
  2. 否则,更新 curnums[i],表示我们从当前元素重新开始一个新的子数组。
  3. 同时维护一个 res 变量,记录到目前为止的最大和。

这样,我们只需要遍历一次数组即可得到结果。

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
func maxSubArray(nums []int) int {
	// 初始化 cur 和 res
	cur := nums[0]
	res := nums[0]

	// 遍历数组
	for i := 1; i < len(nums); i++ {
		// 更新 cur
		if cur+nums[i] > nums[i] {
			cur += nums[i]
		} else {
			cur = nums[i]
		}
		// 更新 res
		if cur > res {
			res = cur
		}
	}
	return res
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func maxSubArray(nums []int) int {
	cur := nums[0] // 当前子数组和
	res := nums[0] // 最大子数组和

	for i := 1; i < len(nums); i++ {
		// 更新当前子数组和
		if cur < 0 {
			cur = nums[i] // 重新开始
		} else {
			cur += nums[i] // 加入当前元素
		}
		// 更新最大子数组和
		if cur > res {
			res = cur
		}
	}
	return res
}
  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。我们只需遍历一次数组。
  • 空间复杂度:O(1),只使用了常数级别的额外空间。

🍏 点击查看 Java 题解

1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2023/31655177
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!