📜  门|门 IT 2007 |第 49 题(1)

📅  最后修改于: 2023-12-03 15:42:21.885000             🧑  作者: Mango

门|门 IT 2007 | 第 49 题

这是一道门|门 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
总结

本题是一道经典的面试题,涵盖了暴力枚举和哈希表两种常见的算法思想。在应对类似的面试题时,我们可以根据具体情况来选择不同的解题方法,要对每一种方法都有较好的理解和掌握,才能更好地应对各种场合。