【问题标题】:Why does my 'Maximum Contiguous Subarray Sum' solution not work for all inputs?为什么我的“最大连续子数组和”解决方案不适用于所有输入?
【发布时间】:2021-07-27 00:03:22
【问题描述】:

对于上下文,这是 Codewars 中的问题陈述: Problem Statement

它本质上是经典的“查找最大子数组和”问题,但重要的附加细节是,在给定所有负数的数组的情况下,应该返回“0”,而不仅仅是最大的负数。

首先,我完全意识到这个解决方案不是一个非常好的或有效的解决方案。话虽如此,对我来说逻辑仍然有意义,所以我不太明白为什么它适用于某些输入而不适用于其他输入。由于测试用例隐藏在 Codewars 中,我无法提供该程序无效的输入。

我尝试使用以下示例运行代码;

  • [1, 0, 2, -3, 6](应该返回 6)
  • [-2, 1, -3, 4, -1, 2, 1, -5, 4](应该返回 6)
  • [-2, -3, 4, -1, 5, 1, 5, -3](应该返回 14)
  • 等。 而且它们都运行良好

再次,我只想知道为什么这段代码不正确背后的逻辑。我不是在寻找正确的替代解决方案(我现在已经知道 Kadane 算法的存在)。这是我第一次盲目尝试解决这个问题,所以我真的 想知道我做错了什么,以便从中吸取教训。

def max_sequence(arr):
    max_sum = 0
    max_subarr_index = 0
    for i, val in enumerate(arr):
        max_sum = max(max_sum, sum(arr[max_subarr_index:i+1]), val)
        if max_sum == val:
            max_subarr_index = i
    return max_sum

【问题讨论】:

    标签: python algorithm


    【解决方案1】:

    缺陷在于max_sum 在您的算法中有双重用途。它用于:

    1. 在目前探索的数组上保持最大找到的总和

    2. 如果较大的数组直接从索引i而不是max_subarr_index开始,则更新max_subarr_index

    首先,您的算法运行良好。第二次它失败了,因为max_sum 不需要与您当前正在查看的子数组有任何关系。例如:

    arr = [3, -4, 1, 1, ...]
    

    现在i = 3 的变量如下所示:

    max_sum = 3
    max_subarr_index = 0
    

    即该算法仍然“认为”最大子数组从索引 0 开始并且总和为 3。但是以索引 3 结束的最大子数组实际上是 [1, 1]max_subarr_index = 2。 IE。实际上有两个最大子数组:

    • 全球性的([3] 代表i = 3
    • 以当前索引结尾的最大总和子数组([1, 1] for i = 3

    您可以通过仅根据valsum(arr[max_subarr_index:i+1]) 的最大值更新max_subarr_index 来解决此问题:

    def max_sequence(arr):
        max_sum = 0
        max_subarr_index = 0
        for i, val in enumerate(arr):
            # update max_subarr_index based on sum of "current" max subarray
            tmp = max(sum(arr[max_subarr_index:i+1]), val)
            if tmp == val:
                max_subarr_index = i
    
            # global maximum found so far
            max_sum = max(max_sum, tmp)
            
        return max_sum
    

    【讨论】:

    • 啊,好的,我现在看到我的逻辑缺陷了,谢谢你的彻底回复!
    猜你喜欢
    • 2019-11-28
    • 2020-04-27
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多