Q1:给定一个包含 n 个整数的数组 nums和目标数target,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = target ?
请你找出所有满足条件且不重复的三元组。
分析:将三数问题转化为两数问题,使用双指针left,right定位,从第一个位置i开始遍历,寻找i之后的满足的nums[l]+nums[r]+nums[i] == target的数
class Solution:
def threeSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
res= []
for i in range(len(nums)):
# 如果排序后第一个数大于target,则跳出循环,不可能有为target的三数之和
if nums[i] > target:
break
if i>0 and nums[i]==nums[i-1]:
continue
l,r = i+1,len(nums)-1
while l<r:
sum = nums[l]+nums[r]+nums[i]
if sum == target:
res.append([nums[i],nums[l],nums[r]])
while l<r and nums[l]==nums[l+1]:
l += 1
while l<r and nums[r]==nums[r-1]:
r -= 1
l += 1
r -= 1
elif sum < target:
l += 1
else:
r -= 1
return res
Q2:
定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
res = 0
nums.sort()
for i in range(len(nums)):
l,r=i+1,len(nums)-1
while l<r:
temp = nums[l]+nums[r]+nums[i]
if res == 0 or res>abs(target-temp):
res = abs(target-temp)
ans = temp
if temp == target:
return target
elif temp<target:
l += 1
else:
r -= 1
return ans
来源:CSDN
作者:crystal---
链接:https://blog.csdn.net/qzcrystal/article/details/104711547