• leetcode(15)三数之和+去重


    三数之和(找出所有满足条件的集合)

    第一种方法:

    解题思路:参考两数之和的hash表的思想

    第二种方法:

    解题思路:排序+双指针

    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;
            if(nums[0]>0||nums[len-1]<0){
                return result;
            }
            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]>0){
                    return result;
                }
                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;
        }
    }
  • 相关阅读:
    [HNOI2010]CITY 城市建设

    [HNOI2011]数学作业
    [NOI2012]美食节
    [HEOI2014]大工程
    [HEOI2013]ALO(待更)
    [HEOI2016/TJOI2016]序列
    贪食蛇(未完待续)
    [HEOI2016/TJOI2016]字符串
    bzoj 2437[Noi2011]兔兔与蛋蛋 黑白染色二分图+博弈+匈牙利新姿势
  • 原文地址:https://www.cnblogs.com/erdanyang/p/11091352.html
Copyright © 2020-2023  润新知