最近在刷力扣上的题目,之前也刷过很多次,一边刷一边忘,很是苦恼。
为什么边学边忘,很大程度是没有应用场景,只是被动的进行填鸭式学习。
为了提高学习效率,觉得还是得坚持写博客,一方面强化记忆,第二强迫自己创造应用场景,学习知识的同时也在产生知识。
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
3.1 思路:
用for循环将数组中的元素和后面的元素分别相加,看是否等于 target ,如果不等于 target,那么就继续拿数组里的第二个数字和后面的数字相加;不停的去一个个试…直到等于target,返回这2个数字所在的下标。
nums = [2, 7, 11, 15]
target = 9
def twoSum(nums,target):
n = len(nums) # # 获取nums的长度,是4
for x in range(n): # # 外层循环先取出下标0,对应着数组里的第一个数字
for y in range(x+1, n): # 内层循环取出下标1,对应着数组里的第二个数字
if nums[x] + nums[y] == target: # 如果满足条件则return下标
return [x, y]
else: # 不满足则跳过当前循环
continue
return None # 都不满足,则返回None
a = twoSum(nums,target)
print(a)
提交力扣,这种解法比较耗时和占用内存,继续优化。
4.1 思路
先遍历所有的数组元素_—— nums[i],计算 target - nums[i],并将结果缓存到容器中,在后续循环中,如果再看到这个值,则返回两者的下标位置。
空间复杂度:O(n)
时间复杂度:O(n)
# 容器缓存法
nums = [2, 7, 11, 15]
target = 9
def twoSum(nums,target):
lis = {} # 设置一个容器字典,用来缓存结果和下标
for index, num in enumerate(nums): # 获取数值和下表
result = target - num # 结果
if num in lis: # 如果数值存在容器中,则返回第一个数值下标,和当前数值下标
return [lis[num], index]
lis[result] = index # 将结果作为容器的key,数值的下标作为value
return None
print(twoSum(nums,target))
4.2 总结:
用时缩短接近10倍
容器中的操作时间复杂度: https://wiki.python.org/moin/TimeComplexity