1.题目描述
leetcode1:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。
解题思路:很多同学第一次解决这道题直接采用暴力解法,确实可以解决出来,但这里我们采用更快捷的哈希表的方式。
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtab={}#构建一个hash表
for i,j in enumerate(nums):#enumerate可以返回数组的下标和值
if target-j in hashtab:#判断target-j的目标值是否在hash表里
return [hashtab[target-j],i] #在的话直接返回
else:
hashtab[j]=i #不在的话添加到里面。
运行结果:
两数之和很简单,我们接着拓展到三数之和
2. 拓展
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()#首先排序
n=len(nums)#计算数组长度
res=[]#初始话结果
for i in range(len(nums)):#选择第一个元素
left=i+1#设置为左指针为i+1个元素
right=n-1#设置右指针为最右边的元素
if i>0 and nums[i]==nums[i-1]:#判断左指针的元素和旁边一个是否相等,相等的话就跳过
continue
while left<right:#寻找三数之和为目标值的元素
if nums[left]+nums[right]<-nums[i]:
left+=1
elif nums[left]+nums[right]>-nums[i]:
right-=1
else:
res.append([nums[i],nums[left],nums[right]])#找到后加入res
while left<right and nums[left]==nums[left+1]:#如果结果中的left和left+1相等,则left再往下一位
left+=1
left+=1
right-=1
return res#返回结果
运行结果:
三数之和用的思想是用2个数来确定第三个数,这样子避免了暴力搜索达到的O(N^3)的复杂度,这里的复杂度是O(N^2)