Leetcode 两数之和

题目描述

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

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

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

Python3解题代码

  • 初始思路:暴力穷举法
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        loc = []
        for s in range(len(nums)):
            for i in range(len(nums)):
                if s == i:
                    pass
                elif nums[s] + nums[i] == target:
                    loc.append(s)
                    loc.append(i)
                    return loc

本思路比较直接,也比较简单,但是时间复杂度比较大,所以在最后一项数据中超过时间限制了。

  • 改进思路:
    后来考虑第二个数只需要从s之后进行查找即可,不需要从头开始查找,因此查找范围可以用 [:-(len(nums)-s)] 表示。
    python序列(表示索引为非负整数的有序对象集合,包括列表,元组,字符串等)中有两种序号取法,例如下面例子,从左向右序号分别是0,1,2,3,从右向左分别是 -1,-2,-3,-4。
    在这里插入图片描述
    alst [start: end :step] 表示从start 取到 end(不包括end)每隔step个成员取一个。(详细了解可以百度序列切片
    因此 [:-(len(nums)-s)] 表示从开始取到s位置(不包含s)。上例当s为3时,[: -1],取值结果为 [2, 7, 11]。
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        loc = []
        for s in range(len(nums)):
            r = target - nums[s]
            if r in nums[:-(len(nums)-s)]:
                print(nums[-(len(nums)-s):])
                loc.append(nums.index(r))
                loc.append(s)
                return loc

 def two_sum(self, nums: List[int], target: int):
        """这样写更直观,遍历列表同时查字典"""
        dct = {}  
        for i, n in enumerate(nums): 
            if target - n in dct: 
                return [dct[target - n], i]
            dct[n] = i

enumerate() 函数翻译过来是列举,枚举的意思。

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
以下是 enumerate() 方法的语法:
enumerate(sequence, [start=0])
引用自 https://www.runoob.com/python/python-func-enumerate.html

nums = [2, 7, 11, 15]  
for i, n in enumerate(nums): 
	dct[n] = i
	
结果为{2: 0, 7: 1, 11: 2}

key为nums里的成员,values为对应的序号。dct[n] 表示 以键 n获取值,这里的值刚好是序列号,因此return [dct[target - n], i]返回的是初始和结束的位置。

  • 遇到的错误

TypeError: twoSum() missing 1 required positional argument: ‘target’

刚开始运行的时候报错,因为方法是写在Solution类中的,因此调用方法的时候要先初始化类 ,再调用方法。

a = Solution()  # 初始化类
print(a.twoSum(nums=[2, 7, 11, 15], target=9))   # 调用方法并传参

本菜鸟没刷过什么题目,基础掌握的也比较差,所以也踩了好几个坑,记下来加深印象也当做成长的记录吧。前段时间看了大佬YJango的学习观(B站链接),很受启发,看到学习方法里面有一方法为费曼技巧,主要思想是以教促学,不仅要输入,更要有输出的学习,因此想着多写写博客加深对知识的理解,希望能坚持,也希望能有所进步。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值