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

Posted xxxxxiaochuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }
}
*/

 

以上是关于15. 三数之和-HashMap-中等难度的主要内容,如果未能解决你的问题,请参考以下文章

每日算法/刷穿 LeetCode15. 三数之和(中等)

Leetcode刷题100天—15. 三数之和( 排序)—day30

每天AC系列:三数之和

每天AC系列:三数之和

最接近的三数之和

Hot10015. 三数之和