一.两数之和
1.题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
2.示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
3.理解:
找到序列nums中两个数,二者和的值等于target,然后返回两个数在序列中的下标(两数不同)。题目本身不难,但是尽可能缩小时间和内存需要仔细斟酌。
4.答题:
4.1暴力循环:使用两层循环遍历,时间复杂度O(n2)。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)- 1):
for j in range(1, len(nums)):
if nums[i] + nums[j] == target and i != j:
return [i, j]
提示为:

查看了一下发现是最后一个用例的序列中数很多,看来直接用双重循环满足不了python3的时间要求。
不过在python里可以,执行用时 :5896 ms,内存消耗 :12.5 MB,显然用时太长。
4.2首尾递进:利用sorted方法和lambda表达式得到排序的下标序列。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
le = len(nums)
a = sorted(range(le), key=lambda i: nums[i])
low = 0
high = len(nums)-1
result = nums[a[low]] + nums[a[high]]
while result != target:
if result < target:
low+=1
elif result > target:
high-=1
result = nums[a[low]] + nums[a[high]]
return [a[low], a[high]]
用时:56ms,内存消耗14.4MB
4.3 转换思路
转换思路,要找两个数,使它们之和为target,不妨设num[i]+num[2]=target,那么就有num[1]=target-num[2],num[i]是序列里的数,就只要判断target-num[2]是否在序列中即可。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
le = len(nums)
for i in range(le-1):
slice1 = nums[i+1:]
#此处如果直接不用切片直接判断整个序列的话会需要更多时间
if target - nums[i] in slice1:
j = slice1.index(target - nums[i])+1+i
#此处加上i+1是因为向后切片造成的index返回的索引值在变化
break
return [i, j]
用时956ms,消耗内存13.9MB
刚才我们是从当前的i向后切片,其实也可以往前切片:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
le = len(nums)
for i in range(1, le):
slice1 = nums[:i]
if target - nums[i] in slice1:
j = slice1.index(target - nums[i])
break
return [j, i] #注意此时输出索引j在前
用时412ms,消耗内存14MB
总结参考了很多大佬的解法,泪奔,发现自己更菜了emm…
点我查看力扣源题目及解答
本文深入探讨了经典的“两数之和”问题,通过三种不同的解决方案,包括暴力循环、首尾递进和转换思路,详细分析了每种方法的时间和空间效率。从基本原理到实践应用,为读者提供了全面的理解。
1835

被折叠的 条评论
为什么被折叠?



