深度优先搜索
深度优先搜索(DFS)就是在每一步时对每一种可能的选择一条道走到底,然后再回过头尝试另外一种选择。
深度优先搜索的关键是要考虑“当前这一步”该如何做,至于“下一步”该怎么做和当前这一步的解决方法是一样的。在进行当前步的选择之前要确定已经做出的选择列表,然后在剩余可供选择的每一种可能进行遍历,对于每一种选择将选择结果以及选择状态代入下一步操作,然后再次进行深度优先搜索。
DFS 实现
DFS的实现考虑要以下几个问题即可:
①.边界范围:即搜索终止条件,递归结束条件。
②.可供选择的范围列表:所有可供选择的范围列表。
③. 已做出的选择列表:标记当前已经做出的选择。
DFS代码模板如下:
void dfs( int cur_step)
{
//判断边界
/********/
//尝试当前可供选择的每种可能
for(int i = 0;i < maxCount;i++)
{
//尝试每种选择
/******/
//选择结果代入下一步
dfs(cur_step+1);
//撤销当前选择,恢复状态
/*******/
}
}
题解示例
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());//先排序,避免在同一个位置放置相同元素值
vector<vector<int>> res;//保存结果
vector<int> cur;//当前排列
vector<int> memo(nums.size(),0);//备忘录,记录已使用的元素
dfs(nums,res,0,cur,memo);
return res;
}
void dfs(vector<int>& nums,vector<vector<int>> &res,int index,vector<int> &cur,vector<int> &memo)
{
if( index > nums.size()-1 )//判断排列完成
{
res.push_back(cur);
return;
}
for(int i = 0;i < nums.size();++i)
{
if(memo[i] == 0 )//该元素未使用过
{
cur.push_back(nums[i]);
memo[i] = 1;
dfs(nums,res,index+1,cur,memo);
memo[i] = 0;//恢复状态
cur.pop_back();
while(i+1 < nums.size() && nums[i] == nums[i+1])//排除相同值元素
{
i++;
}
}
}
}
};