给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
leetcode链接
示例
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
分析
这个题很容易想到得是暴力解法和Hash解法,但是很容易得到重复的,去重的算法甚至比原算法还费力。
所以这个题用双指针左右夹逼。得到不重复的结果
- 先对数组排序
- 用i从头遍历数组到倒数第二位。
- 用俩指针,j和k,j=i+1,k=len-1;
- 如果ijk三个位置的和大于0,那么根据已经排序的特性,k--,缩小和的大小,否则j++,提高和。
- 遇到和为0,可以退出当前i的寻找,i++继续
代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);
for(int i = 0;i < nums.length-2;i++){
if (nums[i] > 0) {
return list;
}
if(i > 0 && nums[i] ==nums[i-1]){
continue;
}
int j = i + 1;
int k = nums.length-1;
while (j<k){
if(nums[i] + nums[j] + nums[k] > 0){
k --;
}else if( nums[i] + nums[j] + nums[k] < 0){
j++;
}else{
List<Integer> a = new ArrayList<>();
a.add(nums[i]);
a.add((nums[j]));
a.add(nums[k]);
list.add(a);
while (k > j && nums[k] == nums[k - 1]) k--;
while (k > j && nums[j] == nums[j + 1]) j++;
k--;
j++;
}
}
}
return list;
}
}
、