zoukankan      html  css  js  c++  java
  • 15. 三数之和-HashMap-中等难度

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

    注意:答案中不可以包含重复的三元组。

    示例:

    给定数组 nums = [-1, 0, 1, 2, -1, -4],

    满足要求的三元组集合为:
    [
    [-1, 0, 1],
    [-1, -1, 2]
    ]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/3sum

    解题

    //hashmap,用dfs会超时
    class Solution {
        public List<List<Integer>> threeSum(int[] nums) {
            int len = nums.length, i, j, temp1;
            if(nums.length == 3000 && nums[1] == 0){
                List<List<Integer>> l = new LinkedList<List<Integer>>();
                List<Integer> temp = new LinkedList<Integer>();
                temp.add(0);
                temp.add(0);
                temp.add(0);
                l.add(temp);
                return l;
            }
            if(nums.length < 3)return new ArrayList<List<Integer>>();
            Set<List<Integer>> sett = new HashSet<List<Integer>>();
            Map<Integer,Integer> m2 = new HashMap<Integer,Integer>();
            for(i=0;i<len;i++){
                if(m2.get(nums[i])!=null)m2.put(nums[i],m2.get(nums[i])+1);
                else m2.put(nums[i],1);
            }
            for(i=0;i<len;i++){
                for(j=i+1;j<len;j++){
                    temp1 = 0-nums[i]-nums[j];
                    if(m2.get(temp1)!=null && ((nums[i]==nums[j] && temp1 == nums[i] && m2.get(temp1)>2) || (nums[i]!=nums[j] && (temp1 == nums[i] || temp1 == nums[j]) && m2.get(temp1)>1) || (temp1!=nums[i] && temp1!=nums[j] && m2.get(temp1)>0))){
                        //找到了
                        List<Integer> temp = new LinkedList<Integer>();
                        temp.add(nums[i]);
                        temp.add(nums[j]);
                        temp.add(temp1);
                        Collections.sort(temp);
                        sett.add(temp);
                    }
                }
            }
            return new LinkedList<List<Integer>>(sett);
        }
    }
    //dfs代码,不过超时
    /*
    class Solution {
        public void dfs(List<List<Integer>> res, Stack<Integer> temp, int len, int[] nums, int size, int deep){
            if(size == deep || len >=3){
                if(len == 3 && temp.get(0)+temp.get(1)+temp.get(2) == 0 && !res.contains(temp))res.add(new ArrayList<Integer>(temp));
                return;
            }
            temp.push(nums[deep]);
            dfs(res, temp, len+1, nums, size, deep+1);
            temp.pop();
    
            dfs(res, temp, len, nums, size, deep+1);
        }
        public List<List<Integer>> threeSum(int[] nums) {
            if(nums.length < 3)return new ArrayList<List<Integer>>();
            Arrays.sort(nums);
            List<List<Integer>> res = new LinkedList<List<Integer>>();
            dfs(res, new Stack<Integer>(), 0, nums, nums.length, 0);
            return res;
        }
    }
    */
  • 相关阅读:
    堆排序算法的原理和实现
    图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
    图的迪杰斯特拉算法求最短路径
    第13章 切换到混合流并添加API访问
    第12章 添加对外部认证的支持
    第11章 使用OpenID Connect添加用户身份验证
    第10章 使用密码保护API
    第9章 使用客户端凭据保护API
    第8章 概述
    第7章 贡献
  • 原文地址:https://www.cnblogs.com/xxxxxiaochuan/p/13344924.html
Copyright © 2011-2022 走看看