力扣第一题两数之和,思路从暴力到哈希,小白视角基于python进行解读

题目:

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。


示例:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

首先很容易想到暴力解法,就是循环呗,我要找两个数,那就先让其中一个数num1(称为第一个数好了,其实没有顺序之说的,只是为了好理解才这样叫)从数组nums的最左边开始循环,另外一个数num2就从num1的右边一位开始循环,这很容易理解,因为第二个数num2不再需要考虑第一个数num1左侧的位置了,比如[1,2,3,4,5,6],当num1=1时,num2可以是2,3,4,5,6都行,当num1=2时,num2可以是3,4,5,6都行,那num2若等于1呢,这岂不是和num1=1,num2=2时的情况重复了,因此不需要考虑num1左边的情况了,那么就有代码如下:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums) #先获取数组的长度
        for num1 in range(n): #然后让num1的索引遍历数组
            for num2 in range(num2 + 1, n): #然后让num2的索引从num1的右边第一位处开始遍历
                if nums[num1 ] + nums[num2 ] == target: #上面就遍历出了所有的情况了,我们只需要将每种情况与target的值进行比较就行啦,如果就是target了,那就把索引返回出来就行了,这里说了只有一种输出结果,所以不需要考虑重复情况,比较简单
                    return [num1 , num1]

上面的暴力解法也能做出来,但是时间复杂度太高了,O(n^{2})的复杂度可不可以降一点呢?

数据结构“哈希表”可以帮上忙!

所谓哈希表,也叫散列表,可以理解为键值对的集合,我在python中对其的理解就是dict(),字典。。。。但是感觉可能不是这么简单,但是我觉得作为小白来说,先这么去理解也没问题,可以先这样理解着去做题嘛。

这里用到了一个函数for i num in enumerate(nums):

其作用是将列表nums,[1,2,3,4,5],就可以返回索引值 i 0,1,2,3,4,元素num 1,2,3,4,5

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashtable = dict() #那首先创建一个哈希表“空字典”
        for i, num in enumerate(nums): #enumerate枚举出来nums中的值,并返回num及其索引i
            if target - num in hashtable: #此时虽然是空字典,我们也要判断,判断target-num是否在该字典中,注意这里的target-num是键哈
                return [hashtable[target - num], i] #那如果target-num在字典中,很好办,直接返回这个键对应的值就行,因为下面会定义出来,target-num这个键对应的值就是它的索引,另外一方面,再返回一个索引i就行了,因为索引i对应的数是num,然后前面那个数是target-num,这加起来不就是target啦
            hashtable[nums[i]] = i #但是显然刚开始的时候,字典都是空的,前面的判断必然是False,直接跳过了,到这里了,字典为空没关系,是False也没关系,因为我可以往里面填充啊,以具体的数nums[i]为键,以该数的索引i为值,建立这个hashtable,那先进入hashtable中的数,我就可以实现一个免费的循环啦,每次做个判断就相当于遍历了这个hashtable中的值,我外面的循环继续去结和hashtable中的所有值来匹配target,只要没有找到和为target的那两个数,这个字典就会不断去填充的,直到最终就能匹配成功,但是省下了一个for循环

从上面来看,哈希表就是利用其特性,省下来了一个for循环,进而将时间复杂度从O(n^{2})降到了O(n),运行时间从3000ms降到了40ms。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会抓鼠鼠的阿猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值