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])

posted @ 2020-05-19 16:57  翠果不是果果  阅读(117)  评论(0编辑  收藏  举报