?个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客
个人专栏
力扣递归算法题
【C++】? ? ? ? ?
数据结构与算法
前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的 ?
我讲述题目会把讲解部分分为3个部分:
1、题目解析
2、算法原理思路讲解
3、代码实现
题目链接:?全排列 II
题目
给定一个可包含重复数字的序列?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
给我们可包含重复数字的序列?nums
?,按任意顺序?返回所有不重复的全排列
输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]]
?
?决策树就是我们后面设计函数的思路
二、设计代码
(1)全局变量
vector<int> path; // 存储路径
vector<vector<int>> ret;
bool check[10] = {false};
(2)设计递归函数
void dfs(vector<int>& nums, int pos);
?
?前提:这个数组是有序的
class Solution
{
vector<int> path; // 存储路径
vector<vector<int>> ret;
bool check[10] = {false};
void dfs(vector<int>& nums, int pos)
{
if (pos == nums.size())
{
ret.push_back(path);
return;
}
for (int i = 0; i < nums.size(); i++)
{
if (check[i] == false && (i == 0 || nums[i] != nums[i - 1] || check[i - 1] != false))
{
path.push_back(nums[i]);
check[i] = true;
dfs(nums,pos+1);
path.pop_back();
check[i] = false;
}
}
}
public:
vector<vector<int>> permuteUnique(vector<int>& nums)
{
sort(nums.begin(),nums.end());
dfs(nums,0);
return ret;
}
};