LeetCode-Q15-三数之和

Q15.三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

1
2
3
4
5
6
7
8
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

1
2
3
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

1
2
3
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:

  • $3 <= nums.length <= 3000$
  • $-105 <= nums[i] <= 105$

思路

  1. 可以发现三数之和,可以递归转化为求数组中的两数之和
  2. 两数之和可以通过排序数组左右指针的方式求出所有解法
  3. 注意,需要排除重复的解法,对于从左向右的求解过程中,只要元素值相同就不需要重复计算可以跳过。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class Solution1 implements ThreeSumSolution{
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums); // 重排序
List<List<Integer>> solutions = new ArrayList<>();
for (int i = 0; i < nums.length-2; i++) {
if(i>0 && nums[i]==nums[i-1]){
continue; // 排除重复的解法
}
int item = nums[i];
List<List<Integer>> match = twoSum(nums,i+1, -item);
match.forEach(x->{
List<Integer> solution = new ArrayList<>();
solution.add(item);
solution.addAll(x);
solutions.add(solution);
});
}
return solutions;
}

public List<List<Integer>> twoSum(int[] nums,int start,int target) {
List<List<Integer>> solutions = new ArrayList<>();
int left= start;
int right = nums.length-1;
while(left<right){ // 终止条件
if(nums[left] + nums[right]> target){
right--;
}else if(nums[left] + nums[right]< target) {
left++;
}else{
if (nums[left] + nums[right] == target) {
List<Integer> solution = new ArrayList<>();
solution.add(nums[left]);
solution.add(nums[right]);
solutions.add(solution);
while (left<right && nums[left] == nums[left+1] ){
left++; // 排除重复的解法
}
while (left<right && nums[right] == nums[right-1]){
right--; // 排除重复的解法
}
left ++;
}
}
}
return solutions;
}
}