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;
        }
    }
  • 相关阅读:
    用HTML5的Audio标签做一个歌词同步的效果
    关于AJAX的跨域问题
    java 计算器后台实现
    springboot 学习(一) 配置mybatis ,全局日期处理
    Java不可见字符处理
    eclipse 常用插件
    Spring data jpa 返回map 结果集
    Oracle数据中表值插不进去问题(转)
    利用Eclipse的JPA自动生成注解实体
    对象-Map 相互转换
  • 原文地址:https://www.cnblogs.com/erdanyang/p/11091352.html
Copyright © 2011-2022 走看看