题干
 
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
 
注意:
 
答案中不可以包含重复的四元组。
 
示例:
 
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
 
满足要求的四元组集合为:
 
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]
 
想法
 
排序 + 双指针,参考官方题解即可https://leetcode-cn.com/problems/4sum/solution/si-shu-zhi-he-by-leetcode-solution/
 
java代码
 
class Solution {
    public List
<List
<Integer>> fourSum(int[] nums
, int target
) {
        List
<List
<Integer>> quadruplets 
= new ArrayList<List
<Integer>>();
        if (nums 
== null 
|| nums
.length 
< 4) {
            return quadruplets
;
        }
        Arrays
.sort(nums
);
        int length 
= nums
.length
;
        for (int i 
= 0; i 
< length 
- 3; i
++) {
            if (i 
> 0 && 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 (int j 
= i 
+ 1; j 
< length 
- 2; j
++) {
                if (j 
> i 
+ 1 && 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;
                }
                int left 
= j 
+ 1, right 
= length 
- 1;
                while (left 
< right
) {
                    int sum 
= nums
[i
] + nums
[j
] + nums
[left
] + nums
[right
];
                    if (sum 
== target
) {
                        quadruplets
.add(Arrays
.asList(nums
[i
], nums
[j
], nums
[left
], nums
[right
]));
                        while (left 
< right 
&& nums
[left
] == nums
[left 
+ 1]) {
                            left
++;
                        }
                        left
++;
                        while (left 
< right 
&& nums
[right
] == nums
[right 
- 1]) {
                            right
--;
                        }
                        right
--;
                    } else if (sum 
< target
) {
                        left
++;
                    } else {
                        right
--;
                    }
                }
            }
        }
        return quadruplets
;
    }
}