LeetCode 1. 两数之和

1. 两数之和

Difficulty: 简单

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

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

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 10<sup>4</sup>
  • -10<sup>9</sup> <= nums[i] <= 10<sup>9</sup>
  • -10<sup>9</sup> <= target <= 10<sup>9</sup>
  • 只会存在一个有效答案

进阶:你可以想出一个时间复杂度小于 O(n<sup>2</sup>) 的算法吗?

Solution

LeetCode第一题,如果使用暴力解法,遍历两遍数组,枚举所有的可能性可解,但是O(n^2)的复杂度必然达不到要求。

暴力解法的时间复杂度过高的原因在于寻找target-e耗费太长时间了,创建一个哈希表,对于数组中的每一个元素e,如果e没有在哈希表中,那么把target-e放入哈希表,继续遍历,如果此时e在哈希表中,说明找到了target-e,并且返回的时候下标的顺序不受影响。

时间复杂度:O(N)

空间复杂度: O(N),哈希表

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        if not nums:
            return []
        d = {}
        for i, e in enumerate(nums):
            if e not in d:
                d[target-e] = i
            else:
                return [i, d[e]]
posted @ 2021-06-22 00:01  swordspoet  阅读(45)  评论(0编辑  收藏  举报