¥15 头尾指针¥三数之和

https://leetcode-cn.com/problems/3sum/solution/san-shu-zhi-he-by-leetcode-solution/

在这里插入图片描述

class Solution {
    
    
 public static List<List<Integer>> threeSum(int[] nums) {
    
    
//        int [] nums={
    
    -4,0,1,2,-1,-1,-4};

        List list = new ArrayList();
        boolean flagg=true;
        int len=nums.length;
        if(len<3) //[][0][0,0]的结果都是[]
            return list;
            //处理[0,0,0,0....]的情况
        for (int i=0;i<len;i++){
    
    
            if( nums[i]!=0){
    
    
                flagg=false;
                break;
            }
        }
        if (flagg==true){
    
    
            List<Integer> listsmall=new ArrayList<Integer>();
            listsmall.add(0);
            listsmall.add(0);
            listsmall.add(0);
            list.add(listsmall);
            return list;
        }

//        for (int i=0;i<len-1;i++){
    
    
//            boolean flag=true;
//            for(int j=0;j<len-1-i;j++){
    
    
//                if(nums[j]>nums[j+1]){
    
    
//                    int temp=nums[j];
//                    nums[j]=nums[j+1];
//                    nums[j+1]=temp;
//                    flag=false;
//                }
//            }
//            if (flag==true)
//                break;
//        }
        //给nums排序
        Arrays.sort(nums);
//        for(int i=0;i<len;i++){
    
    
//            System.out.println(nums[i]);
//        }
        for (int i=0;i<len; i++){
    
    
        // 需要和上一次枚举的数不相同
            if(i>0&&nums[i]==nums[i-1])
                continue;
            int sum=0-nums[i];
            int begin=i+1;
            int end=len-1;
            while(begin<end){
    
    
                int rsum=nums[begin]+nums[end];
                if(rsum>sum)
                    end--;
                if (rsum < sum)
                    begin++;
                if (rsum == sum){
    
    
                    List<Integer> listsmall = new ArrayList<Integer>();
                    listsmall.add(nums[i]);
                    listsmall.add(nums[begin]);
                    listsmall.add(nums[end]);
                    list.add(listsmall);
                    //可能存在多解,跳过相同字符
                    //多解 不存在相同字符:-1 -1 0 1 2 固定第0-1-1-12)(-101//多解 存在相同字符:-1 -1 -1  0 1 2 固定第0-1-1-12)(-1-1(第二个),2),这里的第二个-1就需要跳过,不然会有重复解
                    while(begin<end&&nums[begin+1]==nums[begin]){
    
    
                        begin++;
                    }
                    begin++;
                    while(begin<end&&nums[end-1]==nums[end]){
    
    
                        end--;
                    }
                    end--;
                }
            }
        }
        return list;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41557627/article/details/114320837