题解 | #有重复项数字的全排列#
有重复项数字的全排列
http://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863
用dfs + 回溯
正常的dfs,就是可以不用其他辅助容器标记
字典序用 排序 + 正序的dfs应该是没错
public class Solution {
ArrayList<ArrayList<Integer>> result;
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
Arrays.sort(num);
result = new ArrayList<>();
dfs(new ArrayList<Integer>(),num);
return result;
}
public void dfs (ArrayList<Integer> list, int[] num) {
if (list.size() == num.length) {
result.add(new ArrayList<>(list));
return;
}
for (int i = 0; i < num.length; i++) {
if (i > 0 && num[i] == num[i - 1] || num[i] > 10) {//这里去重加排除已经用过的数据
continue;
}
list.add(num[i]);
num[i] = num[i] + 20;//由于给的数据范围是-1~5,可以用这种方式标记一下
dfs(list, num);
num[i] = num[i] - 20;
list.remove(list.size() - 1);
}
}
}
ArrayList<ArrayList<Integer>> result;
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
Arrays.sort(num);
result = new ArrayList<>();
dfs(new ArrayList<Integer>(),num);
return result;
}
public void dfs (ArrayList<Integer> list, int[] num) {
if (list.size() == num.length) {
result.add(new ArrayList<>(list));
return;
}
for (int i = 0; i < num.length; i++) {
if (i > 0 && num[i] == num[i - 1] || num[i] > 10) {//这里去重加排除已经用过的数据
continue;
}
list.add(num[i]);
num[i] = num[i] + 20;//由于给的数据范围是-1~5,可以用这种方式标记一下
dfs(list, num);
num[i] = num[i] - 20;
list.remove(list.size() - 1);
}
}
}