Algorithm 查找和介于1和2之间的对
给定n正实数时,任务是对以下问题给出是或否的答案:Algorithm 查找和介于1和2之间的对,algorithm,Algorithm,给定n正实数时,任务是对以下问题给出是或否的答案: “是否存在一对数字x和y,使得1只有0和2之间的数字才有助于参与赢家配对。其他数字可以忽略。” 每个这样的数字x都可以从1-x和2-x之间的列表中创建一个额外的数字对。 在浏览列表时计算并维护可接受的边界。在任何给定时间,可接受的下一个值的间隔不能超过两个,因为所有可接受的下一个值的间隔都包含在-1和2之间,且宽度为1。因此,完成一对的可接受下一个值可以用常量表示空间 当列表中出现的数字在最多两个可接受的下一个值的间隔内时,请回答“是”。如果到
“是否存在一对数字x和y,使得1只有0和2之间的数字才有助于参与赢家配对。其他数字可以忽略。” 每个这样的数字
x
都可以从1-x
和2-x
之间的列表中创建一个额外的数字对。
在浏览列表时计算并维护可接受的边界。在任何给定时间,可接受的下一个值的间隔不能超过两个,因为所有可接受的下一个值的间隔都包含在-1和2之间,且宽度为1。因此,完成一对的可接受下一个值可以用常量表示空间
当列表中出现的数字在最多两个可接受的下一个值的间隔内时,请回答“是”。如果到达列表末尾时没有遇到这种情况,请回答“否”
示例:0.1、0.5、2.0
- 启动时,可以显示并完成一对的值集为空集
- 在读取0.1之后,如果现在出现,则完成一对的值集为[0.9,1.9]
- 0.5不属于可以完成一对的值集。但是,读取后,[0.5,1.5]中的值可以完成一对。因为我们已经有了集合[0.9,1.9],可以完成一对的新值集是[0.5,1.9]
- 2.0不属于可以完成一对的值集。但是,我们现在可以读取[-1,0]中的任何值来完成一对。此后,可以读取以完成一对的新值集是[-1,0]∪ [0.5,1.9]
- 等等…
希望这有帮助!实数是保证非负数,还是可以同时有正数和负数?只有正数。散列所有数字,并检查每个数字是否存在1-x或-x或2-x。我想这可能是重复的,因为我记得在堆栈交换的其他地方读过这个问题的答案。我更喜欢如果我能找到它的副本,就不回答这个问题,但我似乎找不到原始的。我想同样的解决方案也可以扩展到这种情况,将(0,1]作为一个范围,将(1,2)作为一个范围我们不能有第二个范围内的两个数字。我们可以有第一个范围内的一个数字和第二个范围内的一个数字。第一个范围内的两个数字也是可能的。希望这能有所帮助。@BhootI不知道为什么这在线性时间和恒定空间内有效。你能详细说明吗?@templatetypedef在值列表上只有一个线性传递。在每一步,该算法测试新值是否可用于完成一对(恒定时间)并将新值合并到下一步开始的可接受值表示中,这也需要恒定的时间。完成一对可接受值集的最复杂表示形式为两个间隔,占用恒定的空间。请注意,如问题主体中所述,该问题只需要“是或否”回答。@templatetypedef但是,也可以在恒定的空间和线性时间内生成获胜的一对。当找到该对的第二个值
y
时,第一个值已被忘记,就足以再次扫描列表以查找它(即,查找一个数字x
,以便1≤ x+y≤ 2.