码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode1. 两数之和

时间:2020-10-06 21:00:33      阅读:20      评论:0      收藏:0      [点我收藏+]

标签:self   并且   target   过程   lis   不能   假设   整数   def   

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

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

解法
一种很容易想到的解法就是,遍历数组,对于每个元素a,看看数组中是否存在target-a的元素,如果有并且target-a的索引和a的索引不同时,返回结果。
上面的解法每次找到target-a之后还要比较和a的索引是否相同,并且实际上这种方法存在冗余。比如遍历到前面的元素p时,会和后面的元素q比较,而遍历到q时,又会和p比较,这实际上是多余的。为了解决上述两个问题,可以遍历元素的时候,只和它前面或者只和它后面的元素进行比较,这样既不会重复比较,也不需要判断索引是否相同。
目前讨论的解法都是暴力搜索,时间复杂度是O(n^2)。比较的过程可以改用hashmap来做:
在遍历每个元素a的时候,先看hashmap中是否有target-a,如果有,找到答案。否则,将a存到hashmap中。因此,hashmap中存放的实际上就是前面的元素,每次查hashmap,实际上是拿当前值和前面的比较,如果查到了,后面的就不用处理了。但是如果先将所有元素都放到hashmap,实际上就把后面不必要的都存了,本题只要求一个解就行,因此一边看一边存非常好。

代码

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashmap = {}    # 创建一个hashmap,键为nums中的数字,值为数字所对应的索引
        for i in range(len(nums)):
            if target - nums[i] in hashmap:
                return [hashmap[target - nums[i]], i]
            hashmap[nums[i]] = i

leetcode1. 两数之和

标签:self   并且   target   过程   lis   不能   假设   整数   def   

原文地址:https://www.cnblogs.com/mmxy/p/13773274.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!