47. Permutations II

題目:

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,
[1,1,2] have the following unique permutations:

[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

思路:
用計數器記錄每個數字出現的次數,然後dfs深度優先搜索,每搜一次,該數字計數器減一,最後回溯

class Solution {
     int [] input;
	 int len;
	 int [] result;
	 List <List<Integer>> output;
	 Map<Integer, Integer> map;
	 Set<Integer> set;
	 int keylen;
	 void dfs(int depth){
		if(depth==len){
			List<Integer> AddToOutput=new ArrayList<Integer>();
			for(int k=0;k<len;k++){
				AddToOutput.add(result[k]);
			}
		    output.add(AddToOutput);
		    return;
		}
        for(int i=0;i<keylen;i++){
        	int value=map.get(input[i]);
        	if(value>=1){
        		result[depth]=input[i];
        		map.put(input[i], value-1);
        		dfs(depth+1);
        		map.put(input[i], value);

        	}
        }
	}
    public List<List<Integer>> permuteUnique(int[] nums) {
        len=nums.length;
    	map=new HashMap<Integer, Integer>();
    	for(int i=0;i<len;i++){
    		if(map.get(nums[i])==null){
    			map.put(nums[i], 1);
    		}
    		else{
    			int tmp=map.get(nums[i]);
    			map.put(nums[i],tmp+1);
    		}
    	}
    	set=map.keySet();
    	keylen=set.size();
    	input=new int[keylen];
    	Iterator<Integer>it=set.iterator();
    	int cnt=0;
    	while(it.hasNext()){
    		input[cnt++]=it.next();
    	}
    	result=new int[len];
    	output=new ArrayList<>();
        dfs(0);
        return output;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章