【问题标题】:Finding continuous subsequence that minimizes the average of the rest of the array?找到使数组其余部分的平均值最小化的连续子序列?
【发布时间】:2016-01-17 01:25:37
【问题描述】:

假设有一个整数数组arr[0..n-1]。找到一个子序列sub[i..j](i > 0 和 j

例子:

arr[5] = {5,1,7,8,2};

删除{7,8},数组变为{5, 1, 2},其平均值为2.67(可能的最小值)。

我认为这是对最长递增子序列的修改,但无法弄清楚。

谢谢,

【问题讨论】:

  • 您还需要定义子序列的长度或剩余的最小元素数。例如,您的示例的更好解决方案是删除 {5, 1, 7, 8} 并获得平均值 2(只有一个元素)。但是,如果您要求生成的数组需要两个或更多元素,那么它不是一个解决方案。
  • 我忘记了 i 和 j 的条件。感谢您指出。
  • 听起来还是不对。 {1} 的平均值为 1,其中 i = 1、j = 1、1 > 0 和 1 < 5-1
  • @user3886450 删除子序列{7,8,2} 不会产生较低的平均值吗? (如果答案应该很明显,我希望你能原谅我。)
  • @Matt 据我所知,您试图为其找到最小平均值的数组实际上是 arr[0..i-1,j+1..n-1]

标签: arrays algorithm array-algorithms


【解决方案1】:

让我们使用二分搜索找到平均值。

假设,所有元素的总和为 S。

对于给定的 x,让我们检查是否存在 i 和 j,使得除从 i 到 j 之外的所有元素的平均值小于或等于 x。

为此,让我们从 arr 中的所有元素中减去 x。我们需要检查是否存在 i 和 j 使得除 i 到 j 之外的所有元素的总和小于或等于零。为此,让我们找到当前数组中所有元素的总和:S' = S - x * n。所以我们想找到 i 和 j 使得 i 到 j 的总和大于或等于 S'。为此,让我们找到最大和的子数组。这可以使用优雅的 Jay Kadane 算法来完成:https://en.wikipedia.org/wiki/Maximum_subarray_problem

何时终止二分查找?当最大子数组总和为零(或足够接近)时。

时间复杂度:O(n log w), w - 二分查找的精度。

【讨论】:

    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2022-12-20
    • 2021-09-25
    • 2014-06-11
    相关资源
    最近更新 更多