描述
给出一个具有重复数字的列表,找出列表所有不同的排列。
样例
样例 1:
输入:[1,1]
输出:
[
[1,1]
]
样例 2:
输入:[1,2,2]
输出:
[
[1,2,2],
[2,1,2],
[2,2,1]
]
主要程序思路,与第15题思路一致,不过这次我将InnerParam作为索引链表了,所以代码有些出入,大家自行查看即可,
public class Solution {
/*
* @param : A list of integers
* @return: A list of unique permutations
*/
public static void diGui(List<Integer> param1, HashSet<List<Integer>> result, int[] nums) {
for (int i = 0; i < nums.length; i++) {
//存放索引的index值
List<Integer> InnerParam = new ArrayList<>(param1);
//如果索引的大小大等于数组长度则进行归档
if (InnerParam.size() == nums.length) {
List<Integer> resultParam = new ArrayList<>();
for(int j = 0;j<InnerParam.size();j++){
resultParam.add(nums[InnerParam.get(j)]);
}
result.add(resultParam);
break;
}
//如果当前索引链表不存在i的时候则进行加元素
if (!InnerParam.contains(i)) {
InnerParam.add(i);
diGui(InnerParam, result, nums);
}
}
}
public static List<List<Integer>> permuteUnique(int[] nums) {
HashSet<List<Integer>> set = new HashSet<List<Integer>>();
List<List<Integer>> result = new ArrayList<>();
if (nums.length == 0) {
List<Integer> paramNull = new ArrayList<Integer>();
result.add(paramNull);
return result;
}
List<Integer> param1 = new ArrayList<>();
diGui(param1, set, nums);
Iterator<List<Integer>> iterator = set.iterator();
while (iterator.hasNext()){
List<Integer> temp = iterator.next();
result.add(temp);
}
return result;
}
};
后来我又优化了一下,好像效果不咋地,运算效率反而更低了。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
public class Exp16_2 {
public static void diGui(List<Integer> param1, List<List<Integer>> result, int[] nums){
for (int i = 0; i < nums.length; i++) {
List<Integer> InnerParam = new ArrayList<>(param1);
//如果索引的大小大等于数组长度则进行归档
if (InnerParam.size() == nums.length) {
List<Integer> resultParam = new ArrayList<>();
for(int j = 0;j<InnerParam.size();j++){
resultParam.add(nums[InnerParam.get(j)]);
}
result.add(resultParam);
break;
}
//如果当前索引链表不存在i的时候则进行加元素
if (!InnerParam.contains(i)) {
InnerParam.add(i);
diGui(InnerParam, result, nums);
}
}
}
public static List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if(nums.length==0){
List<Integer> paramNull = new ArrayList<Integer>();
result.add(paramNull);
return result;
}
List<Integer> param1 = new ArrayList<>();
diGui(param1,result, nums);
HashSet<List<Integer>> param = new HashSet<>(result);
Iterator<List<Integer>> iterator = param.iterator();
result.clear();
while (iterator.hasNext()){
List<Integer> temp = iterator.next();
result.add(temp);
}
return result;
}
public static void main(String[] args) {
int[] param = {1,2,2};
System.out.println(permuteUnique(param));
}
}