描述
给出一个具有重复数字的列表,找出列表所有不同的排列。
样例
样例 1:
输入:
nums = [1,1]
输出:
[
[1,1]
]
解释:[1,1]的不同排列只有[1,1]。
样例 2:
输入:
nums = [1,2,2]
输出:
[
[1,2,2],
[2,1,2],
[2,2,1]
]
解释:[1,2,2]的不同排列有[1,2,2],[2,1,2],[2,2,1]。
这里由于带有重复的元素,因此进行去重操作,最简单的采用HashMap进行去重,把单个结果集放入到key中即可。
public class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
// write your code here
List<List<Integer>> list = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
int[] start = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
start[i] = 0;
}
Map<List<Integer>,String> map = new HashMap<>();
help(nums,map,temp,start);
for (List<Integer> listTemp:map.keySet()) {
list.add(listTemp);
}
return list;
}
public void help(int[] nums, Map<List<Integer>,String> map, List<Integer> temp, int[] flage){
if (temp.size()==nums.length){
List<Integer> list1 = new ArrayList<>();
for (int i = 0; i < temp.size(); i++) {
list1.add(new Integer(temp.get(i)));
}
map.put(list1,"hello Java");
return;
}
for (int i = 0; i < nums.length ; i++) {
if (flage[i]==1) continue;
temp.add(nums[i]);
flage[i] = 1;
help(nums,map,temp,flage);
temp.remove(temp.size()-1);
flage[i] = 0;
}
}
}