📑 题目:53. 最大子序和

🚀 本题 LeetCode 传送门

题目大意

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

解题思路

  • 这一题可以用 DP 求解也可以不用 DP。
  • 题目要求输出数组中某个区间内数字之和最大的那个值。dp[i] 表示 [0,i] 区间内各个子区间和的最大值,状态转移方程是 dp[i] = nums[i] + dp[i-1] (dp[i-1] > 0)dp[i] = nums[i] (dp[i-1] ≤ 0)

代码

  1. package leetcode
  2. // 解法一 DP
  3. func maxSubArray(nums []int) int {
  4. if len(nums) == 0 {
  5. return 0
  6. }
  7. if len(nums) == 1 {
  8. return nums[0]
  9. }
  10. dp, res := make([]int, len(nums)), nums[0]
  11. dp[0] = nums[0]
  12. for i := 1; i < len(nums); i++ {
  13. if dp[i-1] > 0 {
  14. dp[i] = nums[i] + dp[i-1]
  15. } else {
  16. dp[i] = nums[i]
  17. }
  18. res = max(res, dp[i])
  19. }
  20. return res
  21. }
  22. // 解法二 模拟
  23. func maxSubArray1(nums []int) int {
  24. if len(nums) == 1 {
  25. return nums[0]
  26. }
  27. maxSum, res, p := nums[0], 0, 0
  28. for p < len(nums) {
  29. res += nums[p]
  30. if res > maxSum {
  31. maxSum = res
  32. }
  33. if res < 0 {
  34. res = 0
  35. }
  36. p++
  37. }
  38. return maxSum
  39. }