题目来源:https://leetcode.com/problems/permutations-ii/
问题描述
47. Permutations II
Medium
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
------------------------------------------------------------
题意
给定一个含有重复数字的序列nums,求序列的全排列。
------------------------------------------------------------
思路
同LeetCode 46. Permutations(dfs)一样,仍是dfs求解全排列。但是由于有重复元素,所以要给重复元素确定一个唯一的序,否则会产生重复的排列。重复元素唯一的序可以由如下方式确定:
只有当前面的重复元素都访问过,该重复元素才能被访问,否则跳过不执行dfs。
如此一来,只要事先将nums排序,就可以通过上面的方式给每组重复元素确定一个顺序。
------------------------------------------------------------
代码
class Solution {
private List<List<Integer>> ret = new LinkedList<>();
private int n;
private int[] _nums;
private void init(int[] nums)
{
n = nums.length;
_nums = nums;
Arrays.sort(_nums);
}
private void dfs(LinkedList<Integer> cur, boolean[] visited)
{
if (cur.size() == n)
{
ret.add(new LinkedList<Integer>(cur));
return;
}
for (int i=0; i<n; i++)
{
if (visited[i] || (i > 0 && _nums[i] == _nums[i-1] && !visited[i-1]))
{
continue;
}
visited[i] = true;
cur.add(_nums[i]);
dfs(cur, visited);
cur.removeLast();
visited[i] = false;
}
}
public List<List<Integer>> permuteUnique(int[] nums) {
init(nums);
boolean[] visited = new boolean[n];
LinkedList<Integer> cur = new LinkedList<Integer>();
dfs(cur, visited);
return ret;
}
}