【LeetCode.1】两数之和

问题描述

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

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

抽取条件

不能重复利用元素,意思假如target是18,数组为[9,0],你不可以返回[0,0]。

题外话

不知不觉,发现这道题之前已经做过两遍了(java、c++),这种感觉就像是你背单词,每次鼓起勇气开始背,第一个单词总是Abandon。

以后可能会不间断刷刷题了,果然,我还是想用Python3来刷题,能让我有一种刷题的快感,怎么说呢,能让我摆脱语言的束缚,虽然有点费游标卡尺,但能真正享受到算法的乐趣(既然无法反抗,那就享受吧 = =),毕竟Python3很灵活。虽然这道题是easy,但不耽误我给自己开个好头。

思路

  • 最重要的,这道题必须能想到target - current,才能得到最优解。current代表当前正在遍历的元素,令target - current = exist,那么exist就是已经遍历过的元素。如果target - current是已经遍历过的,那么说明两个目标就找到了。
  • 你可能想杠下,那怎么能想到上面这条思路呢:题目里说了 n u m 1 + n u m 2 = t a r g e t num1+num2 = target num1+num2=target,变换一下就是 n u m 1 = t a r g e t − n u m 2 num1 = target - num2 num1=targetnum2,而且想都不用想这个数组至少得循环一遍,当你找到num2时,说明num1已经访问过了。
  • 同样重要的,遍历的过程中,必须以字典形式 保存 已经遍历过的元素,key为元素,value为元素索引。
  • 在做算法题时,能只循环一次,就绝不循环两次。所以,遍历过程,保存元素信息,这点很重要。

代码

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dictionary = dict()

        for i in range(len(nums)):
            current = nums[i]  #当前遍历元素
            if (target - current) in dictionary: #如果另一个目标元素已经遍历过
                return [dictionary[target-current],i]  #取出 遍历过元素的索引 和 当前元素索引,返回
            else:
                dictionary[ nums[i] ] = i  #如果没有找到另一个目标元素,则存储 元素和它的索引

下面为最快代码,除了enumerate没啥区别:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        HashMap={}
        for i,num in enumerate(nums):  #使用enumerate,遍历过程中可直接使用 索引及其对应元素
            if HashMap.get(target-num) is not None:
                return [i,HashMap.get(target-num)]
            HashMap[num]=i
        return []

解法关键词

  • 哈希表(字典、map)

其他

当我看见 冒号 和 -> 时,我懵了,难道Python3可以规定变量的类型了,好久没用Python3,难道Python3又改了,百度了后发现虚惊一场。

还有就是最快代码里的HashMap变量,咋一看,我还以为Python3里有一种数据结构叫HashMap呢,然后发现又是虚惊一场。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值