一、三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。 注意: 答案中不可以包含重复的三元组。
输入: nums = [-1,0,1,2,-1,-4]
输出: [[-1,-1,2],[-1,0,1]]
二、排序+暴力解法
时间复杂度近 不予尝试
三、排序+双指针
package cn.edu.neu.leetcode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author
*
* 三数之和为0
*
*/
public class ThreeNumSumIsZero {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
// 数组长度
int n = nums.length;
// 排序:调用Arrays工具类的排序方法
Arrays.sort(nums);
// 遍历 a
for(int i=0; i<n; i++){
if(nums[i]>=0){
return ans;
}
// 需要和上一次枚举的数不相同
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
// b+c=-a
int target = -nums[i];
// c 对应的指针指向最右端
int k = n-1;
// b>a
for(int j = i+1; j<n; j++){
if(j>i+1 && nums[j]==nums[j-1]){continue;}
// c 指针一致大于 b指针
while (j<k && nums[j]+nums[k]>target){
--k;
}
// 如果指针重合,j继续增加,但是不会有满足 a+b+c=0 且 b<c 的 c 值,退出循环
if(j==k){
break;
}
if(nums[j]+nums[k]==target){
List<Integer> list = new ArrayList<Integer>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
ans.add(list);
}
}
}
return ans;
}
public static void main(String[] args) {
}
}