• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Spillage
博客园    首页    新随笔    联系   管理    订阅  订阅
LeetCode刷题感想之DFS

     在剑指Offer里专门有一个部分(大概是连续十几题的样子)考察了 DFS ,也就是深度优先遍历,感觉DFS 也是一种套路,只要思路找对,套一下思路也可以了,在这里记录一下。

     在很多Leetcode 的刷题题解里,深度优先都被称为回溯法,所以 DFS 包含了两个部分,遍历下去,回溯回来。

     先说遍历下去。

     简单来说,就是当下一步有多条选择(岔路) 的时候,优先选择一条路走到底或者找到最优解为止,也就是使用递归。

     当路走到底了,回来选择另一条,继续,这就是回溯。

     DFS 的好处是不需要保存搜索过程中的状态,搜索过以后就要回溯,在空间上不需要额外保存搜索记录。

     在 LeetCode 下的常见做法是:

     给出一个 int[][] graph , 给定一些需求,要求返回可能的路径集合,即 List<List<Integer, Integer>>. 在这里,关键字就是可能的全部路径,etc.

     举个例子(当然还是 LeetCode 了 https://leetcode.com/problems/all-paths-from-source-to-target)

     题目给了一个包含 n 个节点的无回路有向图,找出所有可能的从节点 0 到节点 n-1 的路径。以下上题:

  

class Solution {
    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> temp = new ArrayList<>();
        temp.add(0);
        dfs(graph,res,temp,0);
        return res;
        
    }
    
    public void dfs(int[][] graph, List<List<Integer>> res, List<Integer> temp,int level){
        if(level == graph.length-1){
            res.add(new ArrayList<>(temp));
            return;
        }
        for(int tem: graph[level]){
            temp.add(tem);
            dfs(graph,res,temp,tem);
            temp.remove(temp.size()-1);
        }
    }
}

  

     

     

posted on 2021-11-15 16:37  Spillage  阅读(46)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3