码迷,mamicode.com
首页 > 其他好文 > 详细

15. 三数之和-HashMap-中等难度

时间:2020-07-20 15:40:10      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:三元   i+1   注意   amp   tps   ||   判断   etc   problem   

给你一个包含 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;
    }
}
*/

 

15. 三数之和-HashMap-中等难度

标签:三元   i+1   注意   amp   tps   ||   判断   etc   problem   

原文地址:https://www.cnblogs.com/xxxxxiaochuan/p/13344924.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!