[Leetcode]Permutations and Permuations II
阿新 • • 發佈:2019-02-10
Permutations
Given a collection of numbers, return all possible permutations.
For example,[1,2,3]
have the following permutations:[1,2,3]
, [1,3,2]
, [2,1,3]
, [2,3,1]
, [3,1,2]
,
and [3,2,1]
.
這是一道最典型得backtracking題目,可以用dfs解決。每次遍歷一位得時候,記錄該位已經被訪問過了,當發現不滿足的情況或者達到需要解返回的情況,導致backtracking之後,再次開放該位的修改許可權。程式碼勝過語言描述。
public List<List<Integer>> permute(int[] num) { List<List<Integer>> res = new ArrayList<List<Integer>>(); if (num == null) { return res; } List<Integer> item = new ArrayList<Integer>(); boolean[] visited = new boolean[num.length]; helper(num, res, item, visited); return res; } private void helper(int[] num, List<List<Integer>> res, List<Integer> item, boolean[] visited) { if (item.size() == num.length) { res.add(new ArrayList<Integer>(item)); return; } for (int i = 0; i < num.length; i++) { if (!visited[i]) { item.add(num[i]); visited[i] = true; helper(num, res, item, visited); visited[i] = false; item.remove(item.size() - 1); } } }
Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,[1,1,2]
have the following unique permutations:[1,1,2]
, [1,2,1]
,
and [2,1,1]
.
相對於I,這個問題多了duplicate,最簡單的方法就是先進行排序,然後再遍歷。遍歷遇到相同的元素,跳過即可。程式碼相對於上一段程式碼僅僅多了排序和一個while迴圈用來去重。
public List<List<Integer>> permuteUnique(int[] num) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
int n = num.length;
if (n == 0) {
return res;
}
List<Integer> item = new ArrayList<Integer>();
Arrays.sort(num);
boolean[] visited = new boolean[n];
helper(res, item, num, visited);
return res;
}
public void helper(List<List<Integer>> res, List<Integer> item, int[] num, boolean[] visited) {
if (item.size() == num.length) {
res.add(new ArrayList<Integer>(item));
return;
}
for (int i = 0; i < num.length; i++) {
if(!visited[i]) {
item.add(num[i]);
visited[i] = true;
helper(res, item, num, visited);
visited[i] = false;
item.remove(item.size() - 1);
while (i+1 < num.length && num[i+1] == num[i]) {
i++;
}
}
}
}