1. 两数之和
题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
测试示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
拓展:列表与字典常见操作的复杂度
- 数组
Operation | Big-O |
---|---|
index | O(1) |
append | O(1) |
pop | O(1) |
pop(i) | O(n) |
insert(i, item) | O(n) |
del | O(n) |
iteration | O(n) |
contains / in | O(n) |
sort | O(n log n) |
multiply | O(nk) |
get slice | O(k) |
del slice | O(n) |
set slice | O(n + k) |
reverse | O(n) |
concatenate | O(k) |
- 字典
Operation | Big-O |
---|---|
copy | O(n) |
get item | O(1) |
set item | O(1) |
del | O(1) |
contains / in | O(1) |
iteration | O(n) |
解题思路:
判断一个元素是否在另一个集合(字符串、数组、字典等)中时,字符串和数组的时间复杂度为 O(n),字典的时间复杂度为 O(1),因此在设计算法时应尽量使用字典作为存放数据的手段。
回到原题,我们只需要遍历一次数组即可,时间复杂度为 O(n),具体实现如下:
class Solution:
def twoSum(self, nums, target):
d = {} # d 的存放格式为 {数值 : 该数值的角标}
for i in range(len(nums)):
if target - nums[i] in d:
# 跳出循环条件为当前差值存在于字典中
return [d[target - nums[i]], i]
d[nums[i]] = i # 如果原数组存在相同数如 [3, 3],则将该键值更新为后一个相同数的角标
return []