给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] :
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
输入:nums = [1,0,-1,0,-2,2], target = 0 输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]示例2
输入:nums = [2,2,2,2,2], target = 8 输出:[[2,2,2,2]]提示
(1)1 <= nums.length <= 200
(2)-109 <= nums[i] <= 109
(3)-109 <= target <= 109
解题思路(1)首先对输入列表按小到大进行排序
(2)遍历列表第一个元素到倒数第四个,指针设置为i,与前一个数相等的进入下次循环
(3)如果最小的前4位数也比target大,则结束循环
(4)如果最大的最后三个数加上第i个数小于target则进入下次循环
(5)遍历列表的第i+1到倒数第三个元素作为第二个数,指针为j,与前一个数相等进入下次循环
(6)如果可选的最小的前4位数也比target大,则结束循环
(7)如果可选最大的最后两个数加上第i和第j个数小于target则进入下次循环
(8)设置left为j+1,right为length-1,代表第三和第四位数指针
(9)如果四位数的和比target大,则right-1,小则left+1
(10)如果四位数的和等于target,将四位数记录进quadruplets,并将left+1继续循环
(11)直到left指针和right指针相遇结束循环,输出所有quadruplets
代码class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
quadruplets = list()
if not nums or len(nums) < 4:
return quadruplets
nums.sort()
length = len(nums)
for i in range(length - 3):
if i > 0 and nums[i] == nums[i - 1]:
continue
if nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target:
break
if nums[i] + nums[length - 3] + nums[length - 2] + nums[length - 1] < target:
continue
for j in range(i + 1, length - 2):
if j > i + 1 and nums[j] == nums[j - 1]:
continue
if nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target:
break
if nums[i] + nums[j] + nums[length - 2] + nums[length - 1] < target:
continue
left, right = j + 1, length - 1
while left < right:
total = nums[i] + nums[j] + nums[left] + nums[right]
if total == target:
quadruplets.append([nums[i], nums[j], nums[left], nums[right]])
while left < right and nums[left] == nums[left + 1]:
left += 1
left += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
right -= 1
elif total < target:
left += 1
else:
right -= 1
return quadruplets
Reference
题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台



