leetcode(15)三数之和+去重

三数之和

解题思路:排序+双指针

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {  
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if(nums.length<=2){
            return result;
        }
        List<Integer> item = null;
        Arrays.sort(nums);
        int len = nums.length;
        int zeroCount = 0;
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<len;i++){
            if(nums[i]==0){
               zeroCount++;  
            }
            map.put(nums[i],i);
        }
        if(zeroCount>=3){
            item = new ArrayList<>();
            item.add(0);
            item.add(0);
            item.add(0);
            result.add(item);
        }
        int l=0;
        int r=0;
        int temp=0;
        Integer t = 0;
        for(int i=0;i<len-2;i++){
            if(nums[i+1]==nums[i]){
                continue;
            }
            if(i>0&&nums[i-1]==nums[i]){
                temp = nums[i]*2;
                t = map.get(-temp);
                if(t!=null&&t>i){
                   item = new ArrayList<>();
                    item.add(nums[i]);
                    item.add(nums[i]);
                    item.add(-temp);
                    result.add(item); 
                }
            }
            l=i+1;
            r=len-1;
            while(l<r){
                if(nums[i]<-nums[l]-nums[r]){
                    while(l<r&&nums[l+1]==nums[l]){
                        l++;
                    }
                    l++;
                }else if(nums[i]>-nums[l]-nums[r]){
                    while(l<r&&nums[r-1]==nums[r]){
                        r--;
                    }
                    r--;
                }else{
                    item = new ArrayList<>();
                    item.add(nums[i]);
                    item.add(nums[l]);
                    item.add(nums[r]);
                    result.add(item);
                    while(l<r&&nums[l+1]==nums[l]){
                        l++;
                    }
                    l++;
                    while(l<r&&nums[r-1]==nums[r]){
                        r--;
                    }
                    r--;
                }
            }
        }
        return result;
    }
}

猜你喜欢

转载自www.cnblogs.com/erdanyang/p/11091352.html
今日推荐