rancho log 回溯算法


DFS算法

DFS常用于解决的问题:(1)从图中取出某种符合条件的路径,或判断是否存在某种路径;图中元素的无序的组合、有序的序列问题;(2)二叉树相关;

面试常问:DFS的时间复杂度一般是O(方案数×找到每个方案的时间复杂度)

做题第一步:绘图分析


一、回溯/基于图的DFS

基于回溯/分治的处理方法,此处暂不区分。
求取结果集的过程转换为树的生长过程叶子节点为最终筛选目标。
在树的生长过程中进行剪枝操作。

1.组合问题

★★组合是无序不重复的,{1,2}=={2,1}★★
77. 组合
剪枝优化:数组中剩余元素数量<实际还需要元素数量。
39. 组合总和
40. 组合总和 II
剪枝优化:1、使用标志数组used;2、在当前层排除当前元素与前一位元素相同的情况。
216. 组合总和 III
17.电话号码的字母组合
用字符串数组映射电话号码的关系。

2.排列问题

★★排列是有序的,{1,2} != {2,1}★★
使用标记数组used[]辅助分析。
46.全排列
47. 全排列 II
526
996

3.分割问题

分割后的子串(子序列、子数组等等)大概率需要进行Isvalid判断。
131. 分割回文串(回文串易涉及DP,需要考虑使用DP进行性能优化)
93.复原IP地址(字节一面)

4.子集问题

子集问题求取的是符合条件的所有节点,与上文的组合、排列、分割对叶子节点进行判断不同。
78.子集:不含重复元素的数组,返回所有子集。
90.子集II:包含重复元素的数组,返回所有子集(排除重复)。

5.棋盘问题

51.N皇后问题
37.解数独
扩展:36. 有效的数独:使用哈希表进行九宫格判断(网易后端笔试,六宫格)

6.矩阵中四个方向的搜索

79.单词搜索(阿里笔试)
非常棒的题目!
DFS图的建立,每一个栅格位置都可以作为一个根节点建立DFS

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        //遍历起点
        for(int row = 0  ; row<board.size() ; row++){
            for(int coloum = 0 ; coloum <board[0].size() ; coloum++){
                //由当前点作为起点出发遍历能找到单词
                if(backtracking(board , word , row , coloum ,0)){
                    return true;
                }
                //返回true
            }
        }
        //未找到
        return false;
    }
private:
    bool backtracking(vector<vector<char>>& board , string word , int row ,int coloum , int index)
    {
        //终止条件-单词搜索完成
        if(index==word.size()) return true;

        //四个方向的回溯遍历不用for循环
        bool entry = false;
        if(row >= 0 && row < board.size() && coloum>=0 && coloum<board[0].size() && board[row][coloum]==word[index])
        {
            //建立四个DFS,上下左右四个方向
            ++index;//word递增
            char temp = board[row][coloum];
            board[row][coloum]='0';//标记为已使用

            entry = backtracking(board , word , row+1 , coloum , index);
            if(entry==false) entry = backtracking(board , word , row-1 , coloum , index);
            if(entry==false) entry = backtracking(board , word , row , coloum-1 , index);
            if(entry==false) entry = backtracking(board , word , row , coloum+1 , index);

            index--;
            board[row][coloum]=temp;
        }
        return entry;
    } 
};

212. 单词搜索 II
回溯+前缀树
980. 不同路径 III

二、二叉树的DFS

待补充

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值