假设有一个整数数组 示例: 删除 我认为这是对最长增长子序列的修改,但无法弄明白。 谢谢,elseif
。找到子序列arr[0..n-1]
(i> 0且j sub[i..j]
arr[5] = {5,1,7,8,2};
,数组变为{7,8}
,其平均值为2.67(尽可能小)。
答案 0 :(得分:0)
让我们使用二分搜索找到平均值。
假设所有元素的总和是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 - 二元搜索的预设。