【问题标题】:Maximum Subarray variation最大子阵列变化
【发布时间】:2012-11-03 08:54:51
【问题描述】:

我必须解决一个类似于最大子数组问题的问题。我必须找到平均值大于 k 的最大子数组。我想到了以下技巧。我可以将大小为 n 的数组 A[] 转换为 B[],其中 B[i] = A[i] - k。所以现在平均值必须> 0。但是平均值大于零并不仅仅意味着总和大于零吗?所以我可以直接应用 Kadane 的算法。我对吗? (总是在有1个正值的约束下)

【问题讨论】:

    标签: average sub-array kadanes-algorithm


    【解决方案1】:

    不,kadane 的算法仍然会为您找到总和最大的子数组...我必须解决同样的问题。到目前为止,我发现如果我们按照上面提到的方式创建数组 B,然后创建包含数组 B 的部分和的数组 C,那么我们正在寻找的最大间隔 (i,j) 具有相同的数字对于 i 和 j !!!例如:

    数组 A 是:1 10 -1 -1 4 -1 7 2 8 1 .....然后给定的 k 是 5 数组 B 是:-4 5 -6 -6 -1 -6 2 -3 3 -4 数组 C 是:-4 1 -5 -11 -12 -18 -16 -19 -16 -20 所以我们要找的子数组是[7,2,8],长度为3,第一个和最后一个元素相同,都是-16!!!

    编辑:我忘了告诉我们正在搜索 O(n) 或 O(n*logn) 算法.... @lets_solve_it 你是对的,但你的算法是 O(n^2) 这就是方式对我们想要处理的数据来说很大。我很接近用 C++ 中的函数映射来解决它,它就像一个哈希表。我认为这是正确的方向,因为这里数组 C 的元素与其索引有直接关系!我们的教授还告诉我们,另一种可能的解决方案是再次制作数组 C,然后采用(特殊?)支点进行快速排序....但我不完全理解我们期望快速排序做什么。

    【讨论】:

      【解决方案2】:

      @panos7:

      创建数组 C(部分求和数组)后,求两个值 C,Ci 和 Cj,

      这样,Cj>=Ci,并且,(j-i) 尽可能“大”。 (j-i) --> 最大值。

      然后返回 j-i。

      在您的示例中,-16>=-18 所以您返回 j-i=9-6=3

      这是正确的答案!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-03
        • 1970-01-01
        • 2014-12-29
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        • 2015-05-04
        相关资源
        最近更新 更多