0%

LeetCode.最大子序和

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

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

动态规划:

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
object MaxSubSeqSum {

def main(args: Array[String]): Unit = {
println(maxSubArray(Array(-2, 1, -3, 4, -1, 2, 1, -5, 4)))
println(maxSubArray(Array(-1, -2)))
}

/**
* 动态规划,时间复杂度O(n)
*/
def maxSubArray(nums: Array[Int]): Int = {
if (nums.length == 0) return 0
if (nums.length == 1) return nums(0)

val dp = new Array[Int](nums.length)
dp(0) = nums(0)
var max = dp(0)
for (i <- 1 until nums.length) {
if (dp(i - 1) >= 0) {
dp(i) = dp(i - 1) + nums(i)
} else {
dp(i) = nums(i)
}
if (dp(i) > max) {
max = dp(i)
}
}
max
}
}