1. 题目描述
题目来源:力扣
给你一个由 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
你可以按 任意顺序 返回答案 。
示例1, 输入: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]]
2. 题解
结题思路如下图,
图1. 四指针图示
算法步骤如下:
1)对nums排序;
2)i从0—len(nums)-3遍历,j从i+1—len(nums)-2遍历,index_left=j+1,index_right=len(nums)-1:
- if nums[i]+nums[j]+nums[index_left]+nums[index_right] = target,且未放入结果,则存入结果,index_left++;
- if nums[i]+nums[j]+nums[index_left]+nums[index_right] < target,index_left++;
- if nums[i]+nums[j]+nums[index_left]+nums[index_right] > target,index_right--;
until index_left=index_right.
代码如下,
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
if len(nums) < 4:
return []
r = []
nums = sorted(nums)
for i in range(len(nums)-3):
for j in range(i+1, len(nums)-2):
index_left = j+1
index_right = len(nums) - 1
while index_left != index_right:
s = nums[i] + nums[j] + nums[index_left] + nums[index_right]
print(s)
if s == target:
if [nums[i], nums[j], nums[index_left], nums[index_right]] not in r:
r.append([nums[i], nums[j], nums[index_left], nums[index_right]])
index_left += 1
elif s < target:
index_left += 1
elif s > target:
index_right -= 1
return r
if __name__ == '__main__':
s = Solution()
nums = [0,0,0,0]
target = 0
r = s.fourSum(nums, target)
print(r)