题目描述
给定一个可包含重复数字的系列nums,按任意顺序返回所有不重复的全排列。
例如:
(1) nums = [1, 1, 2] ==> [1,1,2], [1,2,1], [2,1,1]
(2)nums = [1, 2, 3] ==> [1,2,3], [1,3,2], [2,1,3], [2,3,1],[3,1,2],[3,2,1]
解题方法:回溯搜索
代码
#include <iostream>
#include <vector>
#include <algorithm>
void backtrack(std::vector<int>& nums, int k, std::vector<std::vector<int>>& result) {
int n = nums.size();
if (k == n - 1) {
result.push_back(nums);
}
for (int i = k; i < n; i++) { //从[k, n)中选择一个数组作为第k个数组
std::sort(nums.begin() + k, nums.end()); //想想为什么排序要放在这里
if (i > k && nums[i] == nums[k]) { //不选择重复的数字作为第k个数字
continue;
}
std::swap(nums[k], nums[i]); //选择第i个数组作为第k个数组
backtrack(nums, k + 1, result);
std::swap(nums[k], nums[i]);
}
}
std::vector<std::vector<int>> permuteUnique(std::vector<int>& nums) {
std::vector<std::vector<int>> result;
backtrack(nums, 0, result);
return result;
}
void print_result(const std::vector<int>& nums,
std::vector<std::vector<int>>& result) {
std::cout << "========" << std::endl;
std::cout << "input:" << std::endl;
for (auto num : nums) {
std::cout << num << " ";
}
std::cout << std::endl;
std::cout << "output:" << std::endl;
for (auto& vec : result) {
for (auto value : vec) {
std::cout << value << " ";
}
std::cout << std::endl;
}
}
int main() {
// case1: nums=[1,1,2]
std::vector<int> nums = {1, 1, 2};
std::vector<std::vector<int>> result = permuteUnique(nums);
print_result(nums, result);
// case2: nums=[1,2,3];
nums = {1, 2, 3};
result = permuteUnique(nums);
print_result(nums, result);
// case3: nums=[2,2,1,1]
nums = {2, 2, 1, 1};
result = permuteUnique(nums);
print_result(nums, result);
// case4: nums=[0,1,0,0,9]
nums = {0, 1, 0, 0, 9};
result = permuteUnique(nums);
print_result(nums, result);
return 0;
}
代码运行结果如下:
========
input:
1 1 2
output:
1 1 2
1 2 1
2 1 1
========
input:
2 1 3
output:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
========
input:
2 1 1 2
output:
1 1 2 2
1 2 1 2
1 2 2 1
1 2 1 2
1 2 2 1
2 1 1 2
2 1 2 1
2 2 1 1
2 1 1 2
2 1 2 1
2 2 1 1
========
input:
1 0 0 0 9
output:
0 0 0 1 9
0 0 0 9 1
0 0 1 0 9
0 0 1 9 0
0 0 9 0 1
0 0 9 1 0
0 1 0 0 9
0 1 0 9 0
0 1 9 0 0
0 9 0 0 1
0 9 0 1 0
0 9 1 0 0
1 0 0 0 9
1 0 0 9 0
1 0 9 0 0
1 9 0 0 0
9 0 0 0 1
9 0 0 1 0
9 0 1 0 0
9 1 0 0 0