您的位置:首页 > 其它

[LeetCode]--47. Permutations II

2016-08-08 13:45 423 查看
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]
]


Some Code

Java Solution

public class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if(nums==null || nums.length==0) return res;
boolean[] used = new boolean[nums.length];
List<Integer> list = new ArrayList<Integer>();
Arrays.sort(nums);
dfs(nums, used, list, res);
return res;
}

public void dfs(int[] nums, boolean[] used, List<Integer> list, List<List<Integer>> res){
if(list.size()==nums.length){
res.add(new ArrayList<Integer>(list));
return;
}
for(int i=0;i<nums.length;i++){
if(used[i]) continue;
if(i>0 &&nums[i-1]==nums[i] && !used[i-1]) continue;
used[i]=true;
list.add(nums[i]);
dfs(nums,used,list,res);
used[i]=false;
list.remove(list.size()-1);
}
}
}


Reference1

Reference2

Give some excellent guys’ python code!

Build the list of permutations one number at a time, insert the number into each already built permutation but only before other instances of the same number, never after. Inspired by cbmbbz’s already good solution, though I then saw others had used the idea earlier.

def permuteUnique(self, nums):
perms = [[]]
for n in nums:
perms = [p[:i] +
+ p[i:]
for p in perms
for i in xrange((p +
).index(n) + 1)]
return perms


Very similar to Permutation I, see explanations in https://leetcode.com/discuss/19510/my-ac-simple-iterative-java-python-solution. To handle duplication, just avoid inserting a number before any of its duplicates.

def permuteUnique(self, nums):
ans = [[]]
for n in nums:
new_ans = []
for l in ans:
for i in xrange(len(l)+1):
new_ans.append(l[:i]+
+l[i:])
if i<len(l) and l[i]==n: break              #handles duplication
ans = new_ans
return ans
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: