1两数之和
题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
思路:
1.暴力破解,两重循环 Time:O(n)
2.使用字典模拟哈希查找,用dict.get()直接获取 (targe-第一个数),用空间换时间 Time:O(n)。
3.用列表查找 Time:O(n)
- num2 in nums,返回 True 说明有戏
- nums.index(num2),查找 num2 的索引
法一:字典
两遍循环,记录了 num1 和 num2 的值和位置,而省了再查找 num2 索引的步骤。
tip:在建立字典的第一个for循环中,如果nums中有重复的数字,则for循环完成后,会保存最后一个重复的数字的索引为值。 在第二个循环查找j = hashmap.get(target - num)时,如果nums = [3,7,8,9,3],target =6,则这里j的值是最后一个3的索引,即4. 第二个for循环先遍历到第一个3,即i=0,此时i !=j因而返回[0,4]。 即在第二个for循环中已经内涵对重复数字的判断操作。
#python
def twoSum(nums, target):
hashmap={}
for ind,num in enumerate(nums):
hashmap[num] = ind
for i,num in enumerate(nums):
j = hashmap.get(target - num)
if j is not None and i!=j:
return [i,j]
法二:字典
边循环边查找,mum2 不需要在整个 dict 中去查找。可以在 num1 之前的 dict 中查找,因此就只需要一次循环可解决。
#python
def twoSum(nums, target):
hashmap={}
for i,num in enumerate(nums):
if hashmap.get(target - num) is not None:
return [i,hashmap.get(target - num)]
hashmap[num] = i #这句不能放在if语句之前,解决list中有重复值或target-num=num的情况
Links:
【1】python 字典
【2】pyhton 列表
【3】python enumerate关键字
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
enumerate(sequence, [start=0])