代码之家  ›  专栏  ›  技术社区  ›  xpt

了解leetcode 53的这个(缺失的)解决方案。最大子阵列

  •  -2
  • xpt  · 技术社区  · 1 年前

    对于leetcode问题的解决方案53。最大子数组,我能找到的最全面的答案是 here ,其中列出了&解释了解决问题的4种不同方法。

    下面的解决方案,我还没有找到一个好的解释,

    func maxSubArray(nums []int) int {
        if len(nums) == 1 {
            return nums[0]
        }
        maxSum, res, p := nums[0], 0, 0
        for p < len(nums) {
            res += nums[p]
            if res > maxSum {
                maxSum = res
            }
            if res < 0 {
                res = 0
            }
            p++
        }
        return maxSum
    }
    

    看起来太简单了,无法工作,但它很好地解决了问题。

    有人能看到它是如何工作的吗?特别是为什么要检查 if res < 0 { res = 0 } 是需要的,这意味着什么?

    1 回复  |  直到 1 年前
        1
  •  -1
  •   Abhishek Soti    1 年前

    if res < 0 { res = 0 } 需要,因为nums[p]可能是负整数,因此res可能是负的,所以要实现最大子数组和,最好将nums[p+1]添加到0而不是负整数。这就是为什么 res 为下一次迭代重置为0。

    比方说:res=-2,nums[p+1]=4,把4加到0比把4加到-2要好。

    希望我能把事情说清楚一点。