【问题标题】:size of Smallest subarray with sum greater than a given value总和大于给定值的最小子数组的大小
【发布时间】:2014-08-07 20:55:32
【问题描述】:

原来的问题是

总和大于给定值的最小子数组 给定一个整数数组和一个数字 x,找到总和大于给定值的最小子数组。在http://www.geeksforgeeks.org/minimum-length-subarray-sum-greater-given-value/

但是如果问题只是求最小子数组的大小,我们可以使用分治法吗?

算法: Size_of_min_subarray(1,n) =

{ Size_of_min_subarray(1,n/2), Size_of_min_subarray(n/2,n),Size_of_array_containing mid_element(s) 的最小值}

Size_of_array_containing_mid_element 计算公式:

取中间元素,初始化 sum=mid element/sum of mid element 和 num_elements=1/2 基于 n 是奇数还是偶数。如果 sum给定值。

插图:

1,4,45,6,0,19 和阈值=51

min_size=min{ min_size{1,4,45} , min_size{6,0,19} , min_ contains_45and6 }

min_ contains_45and6:

总和=中间元素/中间元素的总和=45+6=510 将 4 添加到 sum ,sum=55 并增加 num_elements。 num_elements=3。

min_size=min{ 不可能,不可能,3} =3。

这个算法正确吗?我认为它的复杂度是 O(logn),对吗?

编辑:我意识到我用来查找 Size_of_array_containin_mid_elemnts 的算法是错误的。有人可以建议一个算法来查找这个值吗?

【问题讨论】:

标签: algorithm arrays


【解决方案1】:
  1. 没有亚线性算法可以解决这个问题,因为它必须至少考虑每个数组元素一次(最坏情况)。

  2. 您的算法缺少“基本”步骤,即,Size_of_min_subarray(1,n) 用于小 n(无论“小”是什么)。

  3. 您的算法的循环是F(n)=2*F(n/2)+G(n),其中F(n)Size_of_min_subarray 的复杂度nG(n)Size_of_array_containing_mid_element(n) 的复杂度。由于G(n)~O(n),你的算法是O(n)

【讨论】:

    【解决方案2】:
    1. 如果您只是想找到没有任何其他参数的最小子数组(如果我没看错的话),它不总是大小为 1 的数组吗?

      李>
    2. 我解决这个问题的方法(可能是更快的方法)是在原始数组中使用 2 个“指针”来指向索引。您在循环中通过数组移动一个“指针”,直到从后面“指针”到前面“指针”的值的总和大于值 x。您可以根据要对信息执行的操作相当轻松地存储该子数组或仅存储长度。一旦找到可行的解决方案,就将后面的“指针”向前移动,直到两个“指针”之间的总和小于阈值。一旦发生这种情况,您再次向前移动前面的“指针”并重复上述步骤。您比较子数组的长度并最终得出正确的答案。运行时间是 O(n^2) 但它得到了正确的答案。

    我能看到的唯一问题是可能会漏掉某些情况。例如,如果您有 {45, 1, 0, 4, 6, 19} (阈值仍然为 51),我认为通过按照您的方式拆分数组/列表,您可能会因为 45 的拆分而错过解决方案和 6 在列表的不同部分。

    如果我错了,请纠正我,但我认为我所拥有的很接近。

    【讨论】:

    • 谢谢,但是有一个更简单的 o(n^2) 解决方案。大小为 n 的数组只有 n(n+1)/2 个子数组。所以一个简单的蛮力方法是复杂度 o(n^2)
    【解决方案3】:

    一个非常简单的算法是获取每个可能的子数组大小的最大值,直到你有一个总和大于给定值的子数组。

    因此,如果您有一个包含 6 个元素的数组,您开始检查是否有一个大小为 1 的子数组大于或等于给定值(换句话说,单个值大于给定值)。如果不检查大小为 2 的子数组。如果不检查大小为 3 的子数组……然后继续……

    最坏的情况是您需要对所有数组值求和才能达到给定值。

    【讨论】:

    • 这将是复杂度 o(n^2)。有更好的算法吗?
    • 这个算法是二次的。
    • @sds 为什么说它是二次的?我会说它是 o(n^2)。
    • 我认为它是二次的(即O(n^2)),因为您必须考虑所有的开始/结束对(最坏的情况),其中有~n^2
    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2013-08-06
    • 2022-10-12
    • 1970-01-01
    • 2018-12-05
    • 2023-04-06
    相关资源
    最近更新 更多