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;
        }
    }
  • 相关阅读:
    Sql 复习(1)
    记录一次git issue
    JWT自校验框架
    分布式事务分布式锁的常用解决方式
    SpringBoot开发文档
    SpringCloud的使用以及五大核心组件
    SpringMVC
    关于开发中使用AOP的坑
    SpringCloud使用feign远程调用服务注入映射接口失败问题
    springBoot使用Restful跳转路径回显异常问题
  • 原文地址:https://www.cnblogs.com/erdanyang/p/11091352.html
Copyright © 2011-2022 走看看