当前位置: 首页 > 知识库问答 >
问题:

为什么我的“最大邻接子数组和”解决方案不能适用于所有输入?

黎震博
2023-03-14

对于上下文,这是codewars中的problem语句:problem语句

它本质上是一个经典的“查找最大子数组和”问题,尽管增加了一个重要的细节,即给定一个包含所有负数的数组,应该返回一个“0”,而不仅仅是最大的负数值。

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

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

  • [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

共有1个答案

楚骞尧
2023-03-14

该漏洞存在于max_sum在算法中有双重用法。它习惯于:

>

  • 保持到目前为止搜索的数组中找到的最大和

    更新MAX_SUBARR_INDEX,如果较大的数组直接从索引I开始,而不是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。即。实际上有两个最大的子数组:

    • 全局([3]表示i=3)
    • 在当前索引处结束的最大和子数组([1,1]对于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
    

  •  类似资料:
    • 您将获得一个包含n个元素的数组:<代码>d[0],d[1]。。。,d【n-1】。计算所有相邻子数组的最大差值之和。 形式上:S=sum{max{d[l,..., r]}-min{d[l,..., r}},Δ0 输入: 输出: 解释: l=0;r=1;数组:[1,3]和=最大值([1,3])-最小值([1,3])=3-1=2 l=0;r=2;数组:[1,3,2]和=最大值([1,3,2])-最小值(

    • null 我的代码使用一个递归函数和一个helper print()函数来查找这些数字中最大的一个 编辑:发布print()函数,我不知何故错过了这个函数

    • 例如:如果数组是[9,8,7,6,5,4,3,1,2,2],它应该返回46(长度为7的子数组[9,8,7,6,5,4,3]和长度为2的子数组[2,2]之和)。不能组合[9,8,7,6,5,4,3]和[1,2,2],因为这将产生长度为10的非素数的连续子数组(幂等性)。 有谁能解释一下如何使用DP来解决这类问题吗?多谢了。

    • 在长度为N的数组中求和最大的邻接子数组。 输入格式: 输出格式: 返回一个整数,表示相邻子数组的最大可能和。 制约因素: 输入2:A=[-2,1,-3,4,-1,2,1,-5,4] 产出2:6 说明2:子数组[4,-1,2,1]的最大可能和为6。 你能告诉我为什么下面的代码不起作用,代码中的错误是什么吗:

    • 所以,我刚刚进行了一次在线编程评估,给了我两个问题,其中一个是这个连续的子数组和提供了两个复杂的编码问题+8个MCQ,并将在1小时内完成。 这里我将讨论上面提到的子数组的最大邻接和之一。通常,我发现困难的部分是处理负数和连续。我所做的是首先将应用到给定的数组,然后再次按照负值的绝对值排序,就像i的例如,对于给定的随机数组,我在每个i和所有j迭代后都有一个max,如果max 。

    • 最大乘积子数组给定一个数组包含正整数和负整数,求最大乘积的子数组。例子: 但不能破题找到子数组。