题解

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
public List<List<Integer>> threeSum(int[] nums) {  
//创建返回list
List<List<Integer>> result = new ArrayList<>();
//数组元素排序
Arrays.sort(nums);

for (int i = 0; i < nums.length - 1; i++) {
//数组第一个元素大于零,三数值和为零不存在,直接返回
if (nums[i] > 0){
return result;
}
//去除数组重复元素
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
//定义双指针
int left = i+1;
int right = nums.length- 1;

while (left < right){
//三数之和>0 右指针左移
if (nums[i] + nums[left] + nums[right] > 0){
right--;
}else if(nums[i] + nums[left] + nums[right] < 0){
left++; //三数之和<0 左指针右移
}else if(nums[i] + nums[left] + nums[right] == 0){
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
// 去重逻辑应该放在找到一个三元组之后,对right 和 left去重
while (left < right && nums[left + 1] == nums[left]) {
left ++;
}
while (left < right && nums[right - 1] == nums[right]){
right--;
}

right--;
left++;
}

}
}

return result;
}