LeetCode(1)两数之和
题目描述
给定一个整数数组 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
- 大佬的思路
LeetCode 两数之和Python题解
有很多大佬分享他们的思路,受益很多,个人觉得Bruce大佬的解题方法非常简洁。
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站链接),很受启发,看到学习方法里面有一方法为费曼技巧,主要思想是以教促学,不仅要输入,更要有输出的学习,因此想着多写写博客加深对知识的理解,希望能坚持,也希望能有所进步。