【发布时间】:2025-11-29 00:40:01
【问题描述】:
我报名了 Coursera 上的Algorithms, Part II 课程,其中一道面试题(未评分)如下:
2-sum。给定一个由
n64 位整数组成的数组a和一个目标值T, 确定是否存在两个不同的整数i和j使得a[i] + a[j] = T。你的算法应该在最坏的情况下以线性时间运行 案例。提示:按线性时间对数组进行排序。
我可以想办法解决这个问题:
一次性将元素插入哈希表。然后进行第二遍,在哈希表中寻找
T - a[i]。哈希表的空间复杂度为 O(n),2 遍的空间复杂度为 O(n)。此解决方案满足问题中所述的时间要求。对数组进行排序,然后分别从开头和结尾运行2个指针
i和j,寻找a[i] + a[j] = T。如果a[i] + a[j] < T,则增加i,否则减少j。空间复杂度取决于排序算法;假设,快速排序,不需要额外的空间。时间复杂度,nlogn,所以它没有达到问题中所述的时间要求。考虑到问题是在基数排序讲座之后给出的,我假设意图是使用基数排序之一。由于问题指定了 64 位整数,使用
long的二进制表示并使用 In-place MSD radix sort,因此可以在线性时间内对数组进行就地排序。这似乎是最好的方法。
其他想法?
附:我看过这个question,但它假定一个排序数组,并且那里的所有答案都使用某种散列。
我也见过这个question,但对于 2-sum 的具体情况来说,它似乎过于复杂。
【问题讨论】:
-
@lexicore 标记的问题不是重复的,因为数组被指定为在那里而不是在这里排序!
-
我投票支持重新开放。
-
你能分享你尝试过的代码吗?
-
@pamcevoy 没必要,这是关于算法的问题,应该很清楚,我已经考虑过了。您有什么要补充的吗?
-
使用基数排序,您可能可以立即从初始数组中拒绝一些高数字。例如,如果 T = 15,那么任何具有 5 位或更高位的数字都可以立即被拒绝,从而缩短要搜索匹配项的数组。
标签: java arrays algorithm sorting data-structures