Middle-题目76:47. Permutations II

原创 2016年05月31日 16:55:58

题目原文:
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
题目大意:
Middle-题目24,这回数组元素允许重复,还是求所有可能的排列情况。
题目分析:
方法一:(很慢的朴素解法)首先构造一个hashMap,统计每个元素出现的次数,然后开始回溯,先统计这个元素在hashMap中还剩多少个,记为times,然后分别加入1个,2个……再向下搜索,直到hashmap为空则找到一个解。
方法二:discuss中的一个一行解决的办法,暂时不是很能理解。
源码:(language:java/python)
方法一:

public class Solution {
    public static List<List<Integer>> permuteUnique(int[] nums) {
        HashMap<Integer,Integer> set = new HashMap<Integer,Integer>();
        for(int num:nums) {
            if(set.containsKey(num))
                set.put(num, set.get(num)+1);
            else
                set.put(num, 1);                
        }
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        backtrack(list, new ArrayList<Integer>(), set, 0);
        return list;
    }
    private static void backtrack(List<List<Integer>> list, List<Integer> sublist, HashMap<Integer,Integer> set,int last) {
        boolean allZero = true;
        for(int value:set.values()) {
            if(value!=0) {
                allZero = false;
                break;
            }
        }
        if(allZero) 
            list.add(new ArrayList<Integer>(sublist));
        for(int key:set.keySet()) {
            if(key != last || sublist.size() == 0) {
                int times = set.get(key);
                for(int j = 1; j <= times; j++) { // count how many keys there are in set,each times add j of them after sublist
                    set.put(key, times-j);
                    for(int k = 0; k<j; k++)
                        sublist.add(key);
                    backtrack(list, sublist, set, key);
                    for(int k = 0; k<j; k++)
                        sublist.remove(sublist.size()-1);
                    set.put(key, times);
                }
            }
        }
    }
}

方法二:

class Solution(object):
    def permuteUnique(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        return [[n] + p for n in set(nums) for p in self.permuteUnique(nums[:nums.index(n)] + nums[nums.index(n) + 1:])] or [[]]

成绩:
方法一:19ms,beats 22.52%,众数5ms,19.29%
方法二:136ms,beats 27.77%,众数128ms,15.55%
Cmershen的碎碎念:
解法一原则上回溯过程也是不重不漏的,也没有浪费时间在无效解上,但成绩很差,感觉问题出在了hashmap上,可以考虑其他数据结构(例如数组)。解法二有待深入了解python的语法后慢慢理解。但其实不是一个很快的算法。(而且原则上不推荐这组简短但晦涩的代码)

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

Leetcode 47. Permutations II

题意 生成一个数组的全排列,去除重复的排列数组 题解 用递归实现。每个位置的数字都能和它后面的所有数字交换的,一共有n!种。用set去重超时,需要在递归中剪枝。如果交换中两个数的中间有一个数和...
  • u010560443
  • u010560443
  • 2016年03月28日 21:46
  • 311

[leetcode]47. Permutations II,python实现

题目: Given a collection of numbers that might contain duplicates, return all possible unique permut...
  • zl87758539
  • zl87758539
  • 2016年06月16日 16:24
  • 672

[LeetCode]47.Permutations II

【题目】 Given a collection of numbers that might contain duplicates, return all possible unique permu...
  • SunnyYoona
  • SunnyYoona
  • 2015年01月19日 12:21
  • 1739

[leetcode-47]Permutations II(java)

问题描述: Given a collection of numbers that might contain duplicates, return all possible unique permu...
  • zdavb
  • zdavb
  • 2015年08月02日 17:27
  • 670

Permutations II -- LeetCode

原题链接: http://oj.leetcode.com/problems/permutations-ii/  这个题跟Permutations非常类似,唯一的区别就是在这个题目中元素集合可以出现重...
  • linhuanmars
  • linhuanmars
  • 2014年03月20日 01:04
  • 14431

47. Permutations II | Java最短代码实现

原题链接:47. Permutations II 【思路】 本题考查的是回溯算法。与 46. Permutations 不同的是本题数组中的元素可能重复。为此增加了一个记录数组visit。重点在于...
  • happyaaaaaaaaaaa
  • happyaaaaaaaaaaa
  • 2016年03月20日 21:15
  • 611

46. Permutations && 47. Permutations II

DFS BFS
  • Maggie_2015
  • Maggie_2015
  • 2016年01月12日 17:12
  • 60

46. Permutations, 47. Permutations II

permutation
  • u011934885
  • u011934885
  • 2017年11月14日 00:10
  • 42

LeetCode | 47. Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations...
  • pku_Coder
  • pku_Coder
  • 2017年06月29日 23:56
  • 102

leetcode 47. Permutations II

import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.uti...
  • u011438605
  • u011438605
  • 2016年07月22日 10:52
  • 177
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目76:47. Permutations II
举报原因:
原因补充:

(最多只允许输入30个字)