最大子数组和

本文最后更新于:2022年11月17日 中午

题解

最大子数组和

题目:点我直达

image-20221117111714705
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// maxSubArray 最大子数组和
// 这里采用动态规划思路求解
// 定义 dp[i] 为第i个元素的包含前n个子数组的最大值

// 如果 dp[i-1] 为负数的话,就会对当前的dp[i]最大值起到副作用
// 所以我们直接拿arr[i]作为当前dp[i]的最大值即可

// 如果 dp[i-1] 为正数的话,我们直接拿当前的arr[i]加上就是dp[i].因为arr[i]是必须的
// 故不论 arr[i] 是正数还是负数都会产生正作用

// 其中 dp[0] 直接拿 arr[0] 即可

// 动态方程式为:
// arr[i] dp[i-1]<=0
// dp[i] =
// arr[i] + dp[i-1] dp[i-1]>0
func maxSubArray(nums []int) int {
// 定义dp
var dp = make([]int, len(nums))

// dp[0] 没法按照下面的公式求解
dp[0] = nums[0]
for i, num:= range nums{
if i == 0{
continue
}
// 下面就是转移方程式
if dp[i-1] <=0 {
dp[i] = num
}else{
dp[i] = num + dp[i-1]
}
}
// 拿到最大值返回即可
var m = dp[0]
for _, d := range dp {
m = max(d,m)
}
return m
}

func max(a,b int) int{
if a>=b {
return a
}
return b
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!