LeetCode-47.全排列Ⅱ、深度优先搜索

在这里插入图片描述

深度优先搜索

深度优先搜索(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++;
                }
            }       
        }        
    }
};

在这里插入图片描述

©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页