Featured image of post 剑指 Offer 42. 连续子数组的最大和

剑指 Offer 42. 连续子数组的最大和

题目描述

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为 O(n)。

示例 1:

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

提示:

  • 1 <= arr.length <= 10^5
  • -100 <= arr[i] <= 100

注意:本题与主站 53 题相同:https://leetcode-cn.com/problems/maximum-subarray/

解法一:一次遍历

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func maxSubArray(nums []int) int {
    n := len(nums)
    ans, prev := math.MinInt32, 0
    for i := 0; i < n; i++ {
        if prev < 0 {
            prev = nums[i]
        } else {
            prev += nums[i]
        }
        if prev > ans {
            ans = prev
        }
    }
    return ans
}

解法二:动态规划

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
func maxSubArray(nums []int) int {
    n := len(nums)
    dp, ans := make([]int, n), nums[0]
    dp[0] = nums[0]
    for i := 1; i < n; i++ {
        if dp[i-1] < 0 {
            dp[i] = nums[i]
        } else {
            dp[i] = dp[i-1] + nums[i]
        }
        if dp[i] > ans {
            ans = dp[i]
        }
    }
    return ans
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/06/30 10:17:09
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计