跳至主要內容

0001. 两数之和

ITCharge大约 2 分钟

0001. 两数之和open in new window

  • 标签:数组、哈希表
  • 难度:简单

题目链接

题目大意

描述:给定一个整数数组 numsnums 和一个整数目标值 targettarget

要求:在该数组中找出和为 targettarget 的两个整数,并输出这两个整数的下标。可以按任意顺序返回答案。

说明

  • 2nums.length1042 \le nums.length \le 10^4
  • 109nums[i]109-10^9 \le nums[i] \le 10^9
  • 109target109-10^9 \le target \le 10^9
  • 只会存在一个有效答案。

示例

  • 示例 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]

解题思路

思路 1:枚举算法

  1. 使用两重循环枚举数组中每一个数 nums[i]nums[i]nums[j]nums[j],判断所有的 nums[i]+nums[j]nums[i] + nums[j] 是否等于 targettarget
  2. 如果出现 nums[i]+nums[j]==targetnums[i] + nums[j] == target,则说明数组中存在和为 targettarget 的两个整数,将两个整数的下标 iijj 输出即可。

思路 1:代码

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            for j in range(i + 1, len(nums)):
                if i != j and nums[i] + nums[j] == target:
                    return [i, j]
        return []

思路 1:复杂度分析

  • 时间复杂度O(n2)O(n^2),其中 nn 是数组 numsnums 的元素数量。
  • 空间复杂度O(1)O(1)

思路 2:哈希表

哈希表中键值对信息为 $target-nums[i] :i,其中 ii 为下标。

  1. 遍历数组,对于每一个数 nums[i]nums[i]
    1. 先查找字典中是否存在 targetnums[i]target - nums[i],存在则输出 targetnums[i]target - nums[i] 对应的下标和当前数组的下标 ii
    2. 不存在则在字典中存入 targetnums[i]target - nums[i] 的下标 ii

思路 2:代码

def twoSum(self, nums: List[int], target: int) -> List[int]:
    numDict = dict()
    for i in range(len(nums)):
        if target-nums[i] in numDict:
            return numDict[target-nums[i]], i
        numDict[nums[i]] = i
    return [0]

思路 2:复杂度分析

  • 时间复杂度O(n)O(n),其中 nn 是数组 numsnums 的元素数量。
  • 空间复杂度O(n)O(n)