0%

LeetCode(#1) 两数之和-题解笔记 (Python)

在整理资料的时候,突然想起来还有个将近半年未更的博客。经历了这几个月惨无人道的秋招,终于明确自己最大的缺点: 问啥啥不会。痛定思痛之后,决定开始学习并记录,顺便恢复博客的更新。(毕竟域名快到期了)

1. 两数之和

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

方法一:

最先想到的自然是暴力双循环,时间复杂度为\(O(n^2)\),空间复杂度为\(O(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 nums[i] + nums[j] == target:
return [i, j]

方法二:

采用哈希表辅助的方法,时间复杂度为\(O(n)\),空间复杂度为\(O(n)\)

class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
num_dict = {}
for i in range(len(nums)):
if nums[i] in num_dict:
return [num_dict[nums[i]],i]
else:
num_dict[target - nums[i]] = i

总结:

方法一用的是暴力枚举法,分析一下思路可以知道寻找 nums[i] + nums[j] == target 项较为耗时。此时可以想到,常见的时间复杂度优化思路有空间换取时间。由此,可以采用哈希表储存 num_dict[target - nums[i]] 对应的数组索引,这样一来,寻找nums[i] + nums[j] == target 的耗时即为常数时间。

本题为经典的空间换取时间的优化方式。