每日一道算法题:数组中和为0的3个数字
题目:输入一个数组,如何找出数组中所有和为0的3个数字的三元组?需要注意的是,返回值中不得包含重复的三元组。例如,在数组[-1,0,1,2,-1,-4]中有两个三元组的和为0,它们分别是[-1,0,1]和[-1,-1,2]。
public static void main(String[] args) {
int[] numbers = {-1,0,1,2,-1,-4};
System.out.println(threeSum(numbers));
}
public static List<List<Integer>> threeSum(int[] nums){
List<List<Integer>> result = new LinkedList<>();
if(nums.length >= 3){
//将数组从小到大排序
Arrays.sort(nums);
int i = 0;
while(i < nums.length - 2){
//固定第一个数,移动第二个和第三个数
twoSum(nums, i, result);
int temp = nums[i];
//避免第一个数重复
while(i < nums.length && nums[i] == temp){
++i;
}
}
}
return result;
}
public static void twoSum(int[] nums, int i, List<List<Integer>> result){
int j = i + 1;
int k = nums.length - 1;
while(j < k){
if(nums[i] + nums[j] + nums[k] == 0){
//和为0加入到列表中
result.add(Arrays.asList(nums[i], nums[j], nums[k]));
int temp = nums[j];
//避免第二个数重复
while(nums[j] == temp && j < k){
++j;
}
}else if(nums[i] + nums[j] + nums[k] < 0){
//和小于0,则将第二个数向右移动变大
++j;
}else{
//否则和大于0,则将第三个数向左移动变小
--k;
}
}
}
评论