给你一个包含 n
个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0
且不重复的三元组。
注意:答案中不可以包含重复的三元组。
主要是要学会剪枝
题目思路:
1.将数组排序
2.定义三个指针,i,j,k。遍历i,那么这个问题就可以转化为在i之后的数组中寻找nums[j]+nums[k]=-nums[i]这个问题,也就将三数之和问题转变为二数之和(可以使用双指针)
代码如下:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if(nums.length < 3) return res;
Arrays.sort(nums);
if(nums[0] > 0) return res;
for(int i=0;i<nums.length-2;i++){
if(i > 0 && nums[i] == nums[i-1]) continue;
int t = -nums[i];
int j = i+1, k = nums.length - 1;
while(j < k){
if(nums[j] + nums[k] == t){
List<Integer> tmp = new ArrayList<>();
tmp.add(nums[i]);
tmp.add(nums[j]);
tmp.add(nums[k]);
res.add(tmp);
// 去除临近相同的元素
while (j < k && nums[j] == nums[j + 1]) j++;
while (j < k && nums[k] == nums[k - 1]) k--;
j++;
k--;
}
else if(nums[j] + nums[k] < t){
j++;
}
else{
k--;
}
}
}
return res;
}
}
这样剪枝可以避免在res里面判断是否含有tmp再去添加,思路很棒