类型:哈希表、数组、双指针
- 题目:给定一个整数数组 nums 和一个目标值 target,请你在 该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
- 用字典保存遍历过的nums数组中的数字(做字典的键)和下标(字典的值),当发现target-nums[i]在字典的键中出现时,返回当前i,与target-nums[i]在字典中的值,即两个下标。
因为我们需要nums数组的下标,所以将下标当做字典的值而不是键。
时间/空间都是复杂度O(n)。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dict = {}
for i in range(len(nums)):
if target-nums[i] in dict:
return [dict[target-nums[i]], i]#结果返回所需要的下标
else:
dict[nums[i]] = i #字典保存
小知识:1.如果想要检查一个值是否为字典中的键,就可以用关键字 in(或 not in),作用于该字典本身。'color' in spam 本质上是一个简写版本。相当于'color' in spam.keys()。
2. def 函数中 -> 主要是标记返回值数据类型。
3.也可采取双指针算法。将数组从小到大排序,若target值小于前、后指针所指数之和,将前指针后移。若大于,将后指针前移。若两指针重合,则查询失败。时间复杂度是 O(nlogn),空间复杂度O(1)。
例如:
>>> spam = {'name': 'Zophie', 'age': 7}
>>> 'name' in spam.keys()
True
>>> 'Zophie' in spam.values()
True
>>> 'color' in spam.keys() False
>>> 'color' not in spam.keys() True
>>> 'color' in spam
False