每日一道算法题:数组中和为0的3个数字

共 1376字,需浏览 3分钟

 ·

2022-08-05 11:42

题目:输入一个数组,如何找出数组中所有和为0的3个数字的三元组?需要注意的是,返回值中不得包含重复的三元组。例如,在数组[-1,0,1,2,-1,-4]中有两个三元组的和为0,它们分别是[-1,0,1]和[-1,-1,2]。


052fa915bb7b80b9e7c58dfb180fa96c.webp


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; } }}


浏览 37
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报