描述:
给出一个具有重复数字的列表,找出列表所有不同的排列。
给出列表 [1,2,2]
,不同的排列有:
[
[1,2,2],
[2,1,2],
[2,2,1]
]
样例:
思路:
用角标来标记元素,转化成没有重复元素的排列
class Solution {
/**
* @param nums: A list of integers.
* @return: A list of unique permutations.
*/
public List<List<Integer>> permuteUnique(int[] nums) {
// Write your code here
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(nums == null ){
return result;
}
List<Integer> temp = new ArrayList<Integer>();
if(nums.length == 0){
result.add(temp);
return result;
}
search(nums , result , temp);
return result;
}
public void search(int[] nums , List<List<Integer>> result , List<Integer> temp){
if(temp.size() == nums.length){
ArrayList<Integer> p = new ArrayList<Integer>();
for(int i = 0;i<nums.length;i++){
p.add(nums[temp.get(i)]);
}
if(!result.contains(p)){
result.add(p);
}
return ;
}
for(int i = 0;i<nums.length;i++){
if(temp.contains(i)){
continue;
}
temp.add(i);
search(nums , result , temp);
temp.remove(temp.size() - 1);
}
}
}