15. 三数之和

先看一下两数之和的解:

给一个有序数组,返回组成和为指定值的元组
public static void main(String[] args) {
        int[] arr={2, 2 ,4, 5 ,9 ,10 ,12};
        getPair(arr,14);
    }

    public static void getPair(int[] nums,int aim){

        if(nums==null||nums.length<2){
            return;
        }

        int L=0;
        int R=nums.length-1;

        while (L<R){
            //arr[L]+arr[R]> R--  < L++
            if(nums[L]+nums[R]>aim){
                R--;
            }else if(nums[L]+nums[R]<aim){
                L++;
            }else{
                if(L==0||nums[L-1]!=nums[L]){//避免重复值
                    System.out.println("left="+nums[L]+",right="+nums[R]);
                }
                L++;
                R--;

            }
        }

    }

  

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

 

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        // -4 -1 -1 0 1  2
        List<List<Integer>> resultList=new ArrayList<>();
        if(nums==null || nums.length<3){
            return resultList;
        }

      
        Arrays.sort(nums);

        for(int i=0;i<nums.length-2;i++){
            if(nums[i]>0){
                return resultList;
            }
            if(i>0 && nums[i]==nums[i-1]){
                continue;
            }
            int target=-nums[i];

            int L=i+1;
            int R=nums.length-1;
            while(L<R){
                if(nums[L]+nums[R]==target){
                    List<Integer> ans=new ArrayList<>();
                    ans.add(nums[i]);
                    ans.add(nums[L]);
                    ans.add(nums[R]);
                    resultList.add(ans);
                    L++;
                    R--;
                    while(L<R && nums[L]==nums[L-1]){
                        L++;
                    }
                    while(L<R && nums[R]==nums[R+1]){
                        R--;
                    }
                }else if (nums[L]+nums[R]<target){
                    L++;
                }else{
                    R--;
                }
            }
        }
      
        return resultList;


    }
}

  

上一篇:leetcode刷题-[17]电话号码的字母组合


下一篇:Java 实现 后端分页