15. 三数之和
分析
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
//时间复杂度O(n^2)
List<List<Integer>> res = new ArrayList<List<Integer>>();
int p,q,k;
if(nums.length < 3)
return res;
//先排序
Arrays.sort(nums, 0, nums.length);
for(p = 0;p < nums.length - 2; ++p){
//最外层定一个从左向右遍历
//另两个变量相互夹逼找结果
if(p - 1 >= 0 && nums[p] == nums[p - 1])
continue;
q = nums.length - 1;
k = p + 1;
while(k < q){
if(nums[p] + nums[q] + nums[k] > 0){
--q;
while(q > p + 1 && nums[q] == nums[q + 1])
--q;
}else{
if(nums[p] + nums[q] + nums[k] < 0){
++k;
while(k < q && nums[k] == nums[k - 1])
++k;
}else{
List<Integer> tmp = new ArrayList<Integer>();
tmp.add(nums[p]);
tmp.add(nums[k]);
tmp.add(nums[q]);
res.add(tmp);
++k;
--q;
while(k < q && nums[k] == nums[k - 1]&& nums[q] == nums[q + 1])
++k;
}
}
}
}
return res;
}
}