给出从1到N的正整数,其中N可以达到10 ^ 9.缺少来自这些给定整数的一些K个整数.K可以是最多10 ^ 5个元素.我需要找到无法通过有效方式从剩余的NK元素中形成的最小总和.
例; 假设我们有N = 5,这意味着我们有{1,2,3,4,5}并且让K = 2而缺少的元素是:{3,5}那么剩下的数组现在是{1,2,4}最小值不能从这些剩余元素形成的总和为8,因为:
1=1
2=2
3=1+2
4=4
5=1+4
6=2+4
7=1+2+4
Run Code Online (Sandbox Code Playgroud)
那么如何找到这个不可归小的最小值呢?
如果我可以通过这种方法存储所有剩余元素,我知道如何找到它:
我们可以使用类似于Eratosthenes筛子的东西,用于寻找素数.同样的想法,但为不同的目的有不同的规则.
但是,它的空间要求很高.有没有更好更快的方法呢?
这是一个 O(sort(K)) 时间算法。
令 1 ≤ x 1 ≤ x 2 ≤ … ≤ x m为集合中不缺失的整数。对于从 0 到 m 的所有 i,令 y i = x 1 + x 2 + … + x i为前 i 项的部分和。如果存在,则令 j 为满足 y j + 1 < x j+1的最小索引;否则,令 j = m。通过归纳法可以证明,不能得到的最小和是 y j + 1(假设是,对于从 0 到 j 的所有 i,数字 x 1 , x 2 , …, x i可以使所有从 0 到 y i 的总和,没有其他)。
为了处理指定缺失数字的事实,有一种优化可以在恒定时间内处理多个连续数字。我会把它留作练习。
| 归档时间: |
|
| 查看次数: |
907 次 |
| 最近记录: |