【力扣(Leetcode)题目1:两数之和思路讲解——python】

力扣(Leetcode)题目1:两数之和思路讲解——python

两数之和题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

常规(暴力解法)

直接思路

先取出 nums 中的第一个数nums[0],计算与之对应满足题目要求的数b = target - num[0],然后开始遍历nums[1:]numsnums[0] 之后的数),寻找与b相等的数:若有,则返回num[0]b对应的数组下标;
否则,继续从nums中取出下一个数num[j](j>=2),计算与之对应满足题目要求的数b = target - num[j],然后开始遍历nums[j:]numsnums[j] 之后的数),寻找与b相等的数:若有,则返回num[j]b对应的数组下标。

结果展示

在这里插入图片描述

代码展示

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for item_1 in nums:
            now_index = nums.index(item_1)
            next_index = now_index + 1
            target_2 = target - item_1
            nums_1 = nums[next_index:]
            for item_2 in nums_1:
                if item_2 == target_2:
                    return [now_index, next_index + nums_1.index(item_2)]

借用python字典数据类型解法

思路

创建一个字典数据dic,然后将nums中的数据全部存到dic中。其中dic的key是nums中的数字,dic的value是nums中相应数字的数组下标。
接着,仍然按照上面暴力解法中的思路,进行循环查找。
注意:
存在两种情况需要考虑,比如nums = [1,1,3] target = 2; nums = [1,3] target =2
当对于nums中的某一个数nums[j],target - nums[j] = nums[j] = b时,需要判断nums中是否存在两个及以上的数nums[j](原因是字典中key值都是不相同的,在存入字典dict过程中,如果存在相同的key,则保留后者。比如,对于nums = [1,1,3] target = 2,存入dict后有的人可能认为是{1:0,1:1,3:2},但实际字典dict为{1:1,3:2}。所以需要借助原数组nums判断是否存在两个及以上的数nums[j])。如果是,那么返回nums中数i对应的两个数组下标即可;如果为否,此种情况不成立, 继续下一轮循环。

结果展示

在这里插入图片描述

代码展示

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dic = {}
        for value, key in enumerate(nums):
            dic[key] = value
        for i in dic:
            target_1 = target - i
            if target_1 in dic:
                if target_1 != i:
                    return [dic[i],dic[target_1]]
                elif nums.count(i) >= 2:
                    index1 = nums.index(i)
                    index2 = nums.index(i, index1 + 1)
                    return [index1, index2]

总结

可见借助字典数据类型之后,效率提高很多,这是因为在python中,字典的储存是哈希表,通过健值直接进行检索,而列表的读取靠的是偏移,即对列表每一个元素都进行判断。字典的快是用时间换空间。
具体可参考此篇博客:
https://blog.csdn.net/weixin_42681866/article/details/82785127

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值