由于比赛现已结束,我想问一下这个问题。过去三天我一直在努力解决这个问题,因为实际上我无法理解它。
以下是问题: Find the min Facebook Hacker Cup 2013
以下是我找到此问题解决方案的网站: Solutions
我无法理解的是以下部分:
虽然这些K值可以是任何值,但我们可以做出一些有用的观察 关于初始K元素之后的数组内容:
- 每个元素都在0到K之间(包括在内)。
- 因此,K + 1个连续元素的每个窗口将包含0和K之间的每个值恰好一次(即它包含整数0到K的排列)。
- 因此,对于i> 2K:M [i] = M [i - (K + 1)]。
醇>
虽然如果第一点是真的,我能理解第二和第三点。第一个实际上是困扰我。为什么元素必须介于0和K之间,为什么不能将它们全部放在初始K元素中不存在的最小非负整数。
例如: 对于以下测试用例:
1
46 18
7 11 9 46
前K个元素是:
[7,40,35,26,19,34,15,36,37,2,31,28,41,0,9,16,1,20]
现在为什么剩下的元素必须在0到18之间,当我在之前的K元素中有超过18的元素时。
答案 0 :(得分:3)
想象一下你有K个数字{a0,a1,a2...a(k-1)}
,现在你想要找到第一个不在其中的非负数。可以超过K
吗?如果确实如此,那么所有数字{0,1,...K}
都出现在上面的集合中,K+1
数字应该出现在上面的集合中,其中包含K
个数字。这是不可能的,并且与新数字超过K
的假设相矛盾。因此,在每个步骤中,您添加的下一个数字将位于[0,K]
范围内,因此在K+1
步骤中,所有最后K+1
个数字将位于该步骤中,因此其中的数字不同范围。