zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    分布式事务的MQ实现
    zipkin 介绍入门
    线程5问?
    微服务分布式系统架构,转载,备份
    微服务,分布式架构
    史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!
    Tomcat优化
    windows 下安装kafka
    经典台词
    分布式锁3种实现
  • 原文地址:https://www.cnblogs.com/erdanyang/p/11091352.html
Copyright © 2011-2022 走看看