题解 | #有重复项数字的全排列#
有重复项数字的全排列
http://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863
解题思路:
利用递归求出各个可能排列,然后再通过两层循环去掉结果res中的重复项。
java代码:
import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
//递归求解
public void solve(ArrayList<Integer> list, int[] num) {
if (list.size()==num.length) { //判断是否取完,若取完则加入res中
res.add(new ArrayList<>(list));
return;
}
for (int i = 0; i<num.length; i++) {
if (num[i]==-3)
continue;
list.add(num[i]);
int nums = num[i];
num[i] = -3; //未被取走的num数组中的元素则加入list,并置-3
solve(list, num);
list.remove(list.size()-1);
num[i] = nums;
}
}
//排序算法(用的冒泡排序)
public void sort(int[] a) {
int temp;
for (int i = 0; i<a.length; i++) {
for (int j = 0; j<a.length-i-1; j++) {
if (a[j]>a[j+1]) {
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
ArrayList<Integer> list = new ArrayList<>();
//增加排序函数,目的是输出升序
sort(num);
solve(list, num);
//res中包含重复元素,必须去掉
for (int i = 0; i<res.size(); i++) {
for (int j = i+1; j<res.size(); j++) {
if (res.get(i).equals(res.get(j))==true) {
res.remove(j--);
continue;
}
}
}
return res;
}
}

