1、两数之和
#1、两数之和
#(1)返回数而不是下标,改变了原来的数组
def twosum(nums,target):
nums.sort()
left,right=0,len(nums)-1
while left<right:
SUM=nums[left]+nums[right]
if SUM==target:
return nums[left],nums[right]
elif SUM<target:
left+=1
else:
right-=1
return False
twosum([1,2,3,4],7)
#(2)要求返回下标,这个情况下用字典,key是元素,value是元素下标
def twosum2(nums,target):
dic={}
for i ,num in enumerate(nums):
if target-num in dic:
return i,dic[target-num]
else:
dic[num]=i
- 三数之和
看题目要求,是返回所有不重复的数组,还是返回一组数组即可
## (2)三数之和为0,预排序+双指针,返回所有的数组
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
#这个问题要注意两点,第一层循环遍历的时候有重复数字,第二层双指针遍历的时候有重复数字
res,curList=[],[]
nums.sort()
for i in range(len(nums)):
if i==0 or nums[i]>nums[i-1]:#加判断
left,right=i+1,len(nums)-1
while left<right:
sum_t=nums[i]+nums[left]+nums[right]
if sum_t==0:
curList=[nums[i],nums[left],nums[right]]
res.append(curList)
left=left+1
right=right-1
while left <right and nums[left]==nums[left-1]:#加判断
left+=1
while left<right and nums[right]==nums[right+1]:
right-=1
elif sum_t<0:
left+=1
else:
right-=1
return res