• 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;
        }
    }
    */
  • 相关阅读:
    Silverlight 控件绑定到对象
    开源编辑器Makedown的安装
    ASP.NET 4 和 Visual Web Developer 中的新增功能
    空间新闻模块CSS
    P2P之王者电骡Emule技术分析
    QQ向陌生人聊天的autoit脚本
    Er 一个开源游戏的诞生
    一个不错的源代码语法高亮插件dp.SyntaxHighlighter
    Aut2Exe编译au3脚本为可执行文件
    模拟:悬停和纯双点击移动设备的CSS
  • 原文地址:https://www.cnblogs.com/xxxxxiaochuan/p/13344924.html
Copyright © 2020-2023  润新知