15.三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组
public class Test {
/**
* 双指针
* @param nums
* @return
*/
public static List<List<Integer>> threeSum(int[] nums){
Arrays.sort(nums);
int n = nums.length;
//使用set对结果进行去重
Set<List<Integer>> res = new HashSet<>();
for(int i = 0; i < n; i++){
//根据双指针的和,-nums[i] == nums[l] + nums[r]
int l = i + 1;
int r = n - 1;
while(l < r){
if(nums[i] + nums[l] + nums[r] == 0){
res.add(Arrays.asList(nums[i], nums[l], nums[r]));
l++;
r--;
}else if(nums[i] + nums[l] + nums[r] < 0){
l++;
}else {
r--;
}
}
}
List<List<Integer>> list = new ArrayList<>();
list.addAll(res);
return list;
}
public static void main(String[] args){
int[] nums = {-1,0,1,2,-1,-4};
List<List<Integer>> list = threeSum(nums);
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
首先要对数组进行排序,因为这里不需要获取他的下标,所以排序之后,更好的从左到右(主要是从小到大)进行。
然后先将结果存到一个set中,可以把结果去重。
三者之和如果小于0,说明将左指针增大,才会使得等于0。
三者之和如果大于0,说明将右指针减小,才会使得等于0。