双指针一头一尾,向中间靠拢直到相遇,时间复杂度O(n)
1. 两数之和https://leetcode.cn/problems/two-sum/
使用双指针前需要排序,这会使得数之间的顺序发生变化,而两数之和返回的索引。所以在这道题排序之前需要记住每个数字的索引
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums = sorted(
(num, idx) for idx, num in enumerate(nums)
)
i, j = 0, len(nums) - 1
while i < j:
num1, idx1 = nums[i]
num2, idx2 = nums[j]
if num1 + num2 == target:
res = [idx1, idx2]
break
elif num1 + num2 > target:
j -= 1
else:
i += 1
return res
15. 三数之和https://leetcode.cn/problems/3sum/
18. 四数之和https://leetcode.cn/problems/4sum/
三数之和和四数之和最重要的是去重,可以使用set函数,使得代码具有通用性。三数之和中第一个数使用for循环,其他两个数字使用双指针,时间复杂度O(n2) 。四数之和中前两个数使用for循环,其他两个数字使用双指针,时间复杂度O(n3)
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
if len(nums)<3:
return []
nums.sort()
res = set()
for i in range(len(nums)-2):
left,right = i+1,len(nums)-1
while left<right:
if nums[i]+nums[left]+nums[right]==0:
if (nums[i],nums[left],nums[right]) not in res:
res.add((nums[i],nums[left],nums[right]))
left+=1
right-=1
elif nums[i]+nums[left]+nums[right]>0:
right-=1
else:
left+=1
return list(res)
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
if len(nums)<4:
return []
nums.sort()
res = set()
for i in range(len(nums)-3):
for j in range(i+1,len(nums)-2):
left,right = j+1,len(nums)-1
while left<right:
if nums[i]+nums[j]+nums[left]+nums[right]==target:
if (nums[i],nums[j],nums[left],nums[right]) not in res:
res.add((nums[i],nums[j],nums[left],nums[right]))
right-=1
left+=1
elif nums[i]+nums[j]+nums[left]+nums[right]>target:
right-=1
else:
left+=1
return list(res)
16. 最接近的三数之和https://leetcode.cn/problems/3sum-closest/
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
res = nums[0]+nums[1]+nums[len(nums)-1]
for i in range(len(nums)-2):
if i>0 and nums[i]==nums[i-1]:
continue
left,right = i+1,len(nums)-1
while left<right:
temp = nums[i]+nums[left]+nums[right]
if abs(target-temp)<abs(target-res):
res = temp
if temp==target:
return temp
elif temp<target:
left+=1
else:
right-=1
return res