【哈希表】力扣1:两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

  1. 暴力破解
    居然成功了。。
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        for i in range(n - 1):
            for j in range(i + 1, n):
                if nums[i] + nums[j] == target:
                    return [i, j]

时间复杂度:O(n^2)
空间复杂度:O(1)

  1. 哈希表
    方法1时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。因此需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,就找出它的索引。
    使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N) 降低到 O(1):
    创建一个哈希表,key为数组nums中的元素,value为元素位置。对于每一个 num,首先查询哈希表中是否存在 target - num,然后将 num 插入到哈希表中,即可保证不会让 num 和自己匹配。
def two_sum(nums, target):
    """遍历列表同时查字典"""
    dct = {} # hashtable = dict()
    for i, num in enumerate(nums):
        cp = target - n
        if cp in dct:
            return [dct[cp], i]
        else: # 可以不要这一行,下一行提前一个tab
            dct[num] = i

时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。
空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。

posted @ 2022-05-29 22:24  Vonos  阅读(56)  评论(0)    收藏  举报