如何解决在大小为 n-k 的数组中查找 k 个缺失元素
给定 [1,n] 中的 n
唯一整数数组,从数组中随机取出 k
个元素,然后将其打乱以留下大小为 n-k
的数组大小为 n-k
我想找到那些具有最佳复杂度的 k
整数。
如果k==1
,我们可以对数组中的所有元素求和,缺失的元素就是n(n+1)/2
(从1到n的所有数字之和)与数组之和之差元素。
我想通过 k 个方程将这个算法扩展到 k
缺失的元素,但不知道如何构建方程。可以吗?
解决方法
假设 a[1],a[2],a[3],....a[n] 是原始唯一整数,而 b[1],b[2],...b[nk ]是去掉k个整数后的整数。
对数组 a 和 b 进行排序。
对于 b 中的每个相邻对 (i,i+1) 对数组 'a' 中的 b[i],b[i+1] 进行二分搜索并获取索引,例如 p,q
如果 q != p + 1 那么数组 a 中 p 之间的所有整数,q 都在被取走的 k 个整数中。
复杂度应该是 O(n log n )
,是的,可以。不过不好看。
您需要意识到在 [1,n]
范围内
- 平方和为
n(n + 1)(2n + 1) / 6
- 立方体的总和是
n**2(n + 1)**2 / 4
- 等
魔鬼在etc。 k
次幂求和的一般公式是
Sum(i: [1..n]) i**k = 1/(k+1) Sum(j: [1..k]) (-1)**j binom(k+1,j) Bj n**(k-j+1)
其中 Bj
是 Bernoulli's numbers。它是 k+1
次多项式。
众所周知,伯努利数很难计算,而且由此产生的方程组也不太好处理。
假设您克服了所有计算问题,复杂度将为 O(nk)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。