每日一道算法题:数组中和为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;}}}
评论
