16. 带重复元素的排列
给出一个具有重复数字的列表,找出列表所有不同的排列。
样例
样例 1:
输入:[1,1]
输出:
[
[1,1]
]
样例 2:
输入:[1,2,2]
输出:
[
[1,2,2],
[2,1,2],
[2,2,1]
]
挑战
使用递归和非递归分别完成该题。
public class Solution {
/*
* @param : A list of integers
* @return: A list of unique permutations
*/
public List<List<Integer>> permuteUnique(int[] nums) {
arrange(nums, 0, nums.length - 1);
return ret;
}
List<List<Integer>> ret=new ArrayList<>();
Map<Integer, Integer> map = new HashMap<>();
void arrange(int a[], int start, int end) {
if (start >= end) {
List<Integer> lists=new ArrayList<>();
for (int j=0 ;j<a.length;j++){
lists.add(a[j]);
}
if(!ret.contains(lists)){
ret.add(lists);
}
return;
}
for (int i = start; i <= end; i ++) {
if (start==0) {
if(map.containsKey(a[i])){
continue;
}else{
map.put(a[i], start);
}
}
swap(a, i, start); //循环一轮,确保每个元素都能当一次第一元素
arrange(a, start+1, end);//核心思想就是,第一个元素的全排列等于,它加上余下数字的全排列
swap(a, i, start); //完成一次递归后,还完数组,保证不会出现乱序
}
}
void swap(int arr[], int i, int j) {
int te = arr[i];
arr[i] = arr[j];
arr[j] = te;
}
};