• 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;
        }
    }
  • 相关阅读:
    将html转换成image图片png格式
    maven 发布打包部署 命令
    javap 指令集
    国内maven仓库地址
    五行大义
    oracle
    【Centos linux系统】命令行(静默)安装oracle 11gR2
    windows安装mysql-5.7压缩版详细教程
    k8s入门系列之扩展组件(一)DNS安装篇
    k8s入门系列之集群安装篇
  • 原文地址:https://www.cnblogs.com/erdanyang/p/11091352.html
Copyright © 2020-2023  润新知