题目描述:
给定一个可包含重复数字的序列 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]]
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
题目链接:
解题主要思路:
这道题其实跟 "子集" 和 "全排列" 差不多,确定好要用dfs之后,我们应该明确以下几步:
剪枝怎么剪?递归在哪里递归?如何回溯这三步。要理清这三步,脱不开画决策树。
画了决策树之后,我们就可以从根节点开始模拟写代码了。
解题代码:
class Solution {
public:
vector<vector<int>> ret;
vector<int> path;
bool check[9];
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
dfs(nums, 0);
return ret;
}
void dfs(vector<int>& nums, int pos)
{
if (path.size() == nums.size()) {
ret.push_back(path);
return;
}
for (int i = 0; i < nums.size(); ++i)
{
// 剪枝 不合法部分
if (check[i] == true || (i != 0 && nums[i] == nums[i-1] && check[i-1] == false)) {
continue;
}
// dfs
path.push_back(nums[i]);
check[i] = true;
dfs(nums, i+1);
// 回溯
path.pop_back();
check[i] = false;
}
}
};