LeetCode题解 1. 两数之和

Author:baiyucraft

BLog: baiyucraft’s Home


一、题目描述

题目地址:1. 两数之和 - 力扣(LeetCode)

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

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

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

输入:nums = [2,7,11,15], target = 9

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

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

输出:[1,2]

输入:nums = [3,3], target = 6

输出:[0,1]

二、思路以及代码

1. 暴力解法

思路:

  最容易想到的解法,从头枚举数组中的每一个数x,如果target - x在该数后面的数组中,则返回两个数的下标:

动画:

代码:

1
2
3
4
5
6
7
8
9
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n = len(nums)
for i in range(n):
for j in range(i + 1, n):
if nums[i] + nums[j] == target:
return [i, j]
# 没找到返回空
return []

复杂度分析:

时间复杂度:o(n2)o(n^{2})1+2+3++n1=n(n1)21+2+3+\ldots +n-1=\dfrac{n\left( n-1\right) }{2}

空间复杂度:o(1)o(1)

2. 字典查找

  上面的暴力解法,时间复杂度较高,原因是两层循环遍历了数组,那能不能一次循环就实现呢,这时候就可以用字典来实现:

思路: 遍历时,计算target - num的值,如果该值不是hashmap的键,就创建一个名为num的键,并且值为其在列表中的下标;如果target - num的值是hashmap的键,则找到了这样的一组数,返回对应数组下标

动画

代码

1
2
3
4
5
6
7
8
9
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashmap = {}
for i, num in enumerate(nums):
tmp = target - num
if tmp in hashmap:
return [hashmap[tmp], i]
hashmap[num] = i
return []

复杂度分析:

时间复杂度:o(n)o(n)

空间复杂度:o(n)o(n)


LeetCode题解 1. 两数之和
http://baiyucraft.top/LeetCode/LeetCode-1.html
作者
baiyucraft
发布于
2021年5月19日
许可协议