力扣(Leetcode)题目1:两数之和思路讲解——python
两数之和题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
常规(暴力解法)
直接思路
先取出 nums 中的第一个数nums[0],计算与之对应满足题目要求的数b = target - num[0],然后开始遍历nums[1:](nums中nums[0] 之后的数),寻找与b相等的数:若有,则返回num[0]与b对应的数组下标;
否则,继续从nums中取出下一个数num[j](j>=2),计算与之对应满足题目要求的数b = target - num[j],然后开始遍历nums[j:](nums中nums[j] 之后的数),寻找与b相等的数:若有,则返回num[j]与b对应的数组下标。
结果展示
代码展示
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for item_1 in nums:
now_index = nums.index(item_1)
next_index = now_index + 1
target_2 = target - item_1
nums_1 = nums[next_index:]
for item_2 in nums_1:
if item_2 == target_2:
return [now_index, next_index + nums_1.index(item_2)]
借用python字典数据类型解法
思路
创建一个字典数据dic,然后将nums中的数据全部存到dic中。其中dic的key是nums中的数字,dic的value是nums中相应数字的数组下标。
接着,仍然按照上面暴力解法中的思路,进行循环查找。
注意:
存在两种情况需要考虑,比如nums = [1,1,3] target = 2; nums = [1,3] target =2
当对于nums中的某一个数nums[j],target - nums[j] = nums[j] = b时,需要判断nums中是否存在两个及以上的数nums[j](原因是字典中key值都是不相同的,在存入字典dict过程中,如果存在相同的key,则保留后者。比如,对于nums = [1,1,3] target = 2,存入dict后有的人可能认为是{1:0,1:1,3:2},但实际字典dict为{1:1,3:2}。所以需要借助原数组nums判断是否存在两个及以上的数nums[j])。如果是,那么返回nums中数i对应的两个数组下标即可;如果为否,此种情况不成立, 继续下一轮循环。
结果展示
代码展示
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dic = {}
for value, key in enumerate(nums):
dic[key] = value
for i in dic:
target_1 = target - i
if target_1 in dic:
if target_1 != i:
return [dic[i],dic[target_1]]
elif nums.count(i) >= 2:
index1 = nums.index(i)
index2 = nums.index(i, index1 + 1)
return [index1, index2]
总结
可见借助字典数据类型之后,效率提高很多,这是因为在python中,字典的储存是哈希表,通过健值直接进行检索,而列表的读取靠的是偏移,即对列表每一个元素都进行判断。字典的快是用时间换空间。
具体可参考此篇博客:
https://blog.csdn.net/weixin_42681866/article/details/82785127