【力扣】关于两数求和问题python字典应用的总结

题目:两数求和(来源:力扣网)

要求:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和,为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:

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

已经给出的代码

class Solution:
    def twoSum1(nums: List[int], target: int) -> List[int]:

1.解决本题目的关键

通过查找target - nums[i]的值是不是出现在nums列表里面即可

2.解法一(只通过列表list解决):

# 不通过字典,只用list
    def twoSum2(nums: List[int], target: int) -> List[int]:
        list = []
        for w in range(0,len(nums)):
            w1 = target - nums[w] 
            #通过nums[:w]可以避免本身和排除已经搜索过的所有元素,降低了复杂度,搜索时间是O(n)
            if w1 in nums[:w]:
                return [w,nums.index(w1)]
                break
        return None

不好的地方:list插入很快,但是搜索很慢

解法2(借助字典解决):

    def twoSum1(nums: List[int], target: int) -> List[int]:
        list = []
        map = dict()
        a = len(nums)
        for w in range(0, a):
            w1 = target - nums[w]
            if w1 in map:# 字典中搜索key是否有target-nums[w]存在,效率极快
                return [map[w1], w]
            # 插入字典操作放在在条件判断后面,避免值重复导致搜索到的value位置错误
            map[nums[w]] = w
        return None

解决了方法list搜索慢的缺点,速度提高了很多

ps:也是网上总结下来的,实在太菜了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值