LeetCode 47. Permutations II (全排列II)
题目
链接
https://leetcode.cn/problems/permutations-ii/
问题描述
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
提示
1 <= nums.length <= 8
-10 <= nums[i] <= 10
思路
和全排列相同,只需要多设置一个used数组,用于存放是否用过。
复杂度分析
时间复杂度 O(n2)
空间复杂度 O(n)
代码
Java
List<List<Integer>> ans = new LinkedList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
boolean[] used = new boolean[nums.length];
Arrays.sort(nums);
trace(nums, used);
return ans;
}
public void trace(int[] nums, boolean[] used) {
if (path.size() == nums.length) {
ans.add(new ArrayList<>(path));
return;
}
for (int i = 0; i < nums.length; i++) {
if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) {
continue;
}
if (used[i] == false) {
used[i] = true;
path.add(nums[i]);
trace(nums, used);
path.remove(path.size() - 1);
used[i] = false;
}
}
}