题目:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:输入:nums = []
输出:[]来源:力扣(LeetCode)
链接:
https://leetcode-cn.com/problems/3sum
分析:
这道题没有什么高级解法, 主要用排序+双指针的方法,排序后可以有效降低复杂度。按实际情况来说,其实是有三指针的,第一个指针也就是最外层遍历用来确定第一个数,这样做的原因是将三数相加变为两数相加。
变成两数相加后,用双指针从两端同时往中间遍历,这样问题就简单很多。接下来另外一个关键问题就是排重,使用排序另一个好处就是排重,每次获得三数和为0时就判断元素与上一次是否相同就行了。
代码:
class Solution {
public List<List<Integer>> threeSum(int[] nums){
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(nums.length < 3){
return result;
}
Arrays.sort(nums);
for(int i=0;i<nums.length && nums[i]<1;i++){
if(i>0 && nums[i] == nums[i-1]){
continue;
}
int lastR = -1;
int r = nums.length -1;
for(int j=i+1;j<nums.length && r>j && nums[r] >=0 ;){
if( nums[r] == lastR){
r--;
continue;
}
int tmp = nums[i] + nums[j] + nums[r];
if(tmp == 0){
List<Integer> list = new ArrayList<Integer>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[r]);
result.add(list);
lastR = nums[r];
r--;
j++;
}else if(tmp > 0){
r--;
}else {
j++;
}
}
}
return result;
}
}