提示:本文章为力扣题目的练习记录,如有侵权,请联系作者删除。
前言
最近开始刷力扣的算法题了,每次刷完来这里复盘一下。使用的语言是python,思路仅做参考。
一、题目要求
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
二、输入输出示例
1.示例1
输入:nums = [2,7,11,15], target = 9 输出:[0,1]
2.示例2
输入:nums = [3,2,4], target = 6 输出:[1,2]
三、解决方案
1.暴力求解法
最容易想到的方法,实现方法如下。时间复杂度为O(n^2),空间复杂度为O(1)。
class Solution(object):
def twoSum(self, nums, target):
out=[]
for i in range(0,len(nums)):
for j in range(0,len(nums)):
if j>i:
if nums[i]+nums[j]==target:
out.append(i)
out.append(j)
return out
2.哈希表法
是一种优化搜索方法。在哈希表中存放按时未能符合要求的数字,可以将其想象成人脑的记忆功能。
比如,输入nums = [2,15,11,7,56], target = 9,只看第一个数,肯定不知道第几个数和第几个数相加等于9,因为你此时只拥有一个数字,先把这个数字记住。再往下看第二个数,发现15和记忆中的2相加不满足条件,把15放进记忆中,再往下看。第三个数和记忆中的2和15相加都不满足条件,再把11放入记忆。第四个数,7和记忆中的2相加等于9,解就找到了。
这种方法的时间复杂度是O(n),空间复杂度是O(n),跟暴力枚举的方法相比,是典型的以空间换时间的策略。
class Solution(object):
def twoSum(self,nums, target):
out=[]
haxi=[]
for i in range(0,len(nums)):
if target-nums[i] in haxi:
out.append(i)
out.append(haxi.index(target-nums[i]))
else:
haxi.append(nums[i])
return out
四、总结
通过提交结果来看,第二种方法所用的时间不到第一种的1/10,空间资源使用相差不多。因此更推荐第二种搜索策略。