📅  最后修改于: 2023-12-03 15:42:21.885000             🧑  作者: Mango
这是一道门|门 IT 2007年的编程题,难度适中,需要一些基本的编程知识和算法思维。
给定一个数组 numbers
和一个整数 target
,请你从数组中找出两个数,使它们的和等于 target
,并返回这两个数的下标。
你可以假设每个输入都只对应一组答案,而且同样的元素不能被重复利用。
示例:
输入: numbers = [2, 7, 11, 15], target = 9 输出: [0, 1] 解释: nums[0] + nums[1] = 2 + 7 = 9 , 返回 [0, 1] 。
这道题可以用两种方法来解决:暴力枚举和哈希表。
暴力枚举的思路非常简单:遍历每一个数,然后再遍历它后面的数,看看它们的和是否等于 target
。这种方法时间复杂度为 $O(n^2)$,不过代码非常容易实现。
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
n = len(numbers)
for i in range(n):
for j in range(i + 1, n):
if numbers[i] + numbers[j] == target:
return [i, j]
哈希表的思路也很容易理解:遍历每一个数,然后将它与目标数的差值作为键,下标作为值存储在哈希表中。接着遍历每一个数,查看它的值是否在哈希表中出现过,如果出现过,说明已经找到了两个数的和为目标数,这时只需要返回两个数的下标即可。这种方法时间复杂度为 $O(n)$,但需要较多的空间来存储哈希表。
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
n = len(numbers)
hashtable = {}
for i in range(n):
if target - numbers[i] in hashtable:
return [hashtable[target - numbers[i]], i]
hashtable[numbers[i]] = i
本题是一道经典的面试题,涵盖了暴力枚举和哈希表两种常见的算法思想。在应对类似的面试题时,我们可以根据具体情况来选择不同的解题方法,要对每一种方法都有较好的理解和掌握,才能更好地应对各种场合。