刷题——搜索算法

DFS

二叉树的最大深度

二叉树的最大深度
给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。
示例:
在这里插入图片描述

var maxDepth = function(root) {
if(root == null){
    return 0
  }else{
    let left=maxDepth(root.left)
    let right=maxDepth(root.right)
    return Math.max(left,right)+1
  }
};

二叉树的最小深度

二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点

示例:
输入:root = [3,9,20,null,null,15,7]
输出:2

示例:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

var minDepth = function(root) {
  if(root == null){
    return 0
  }
  if(root.left == null && root.right == null){
    return 1
  }
  let min_deep = Infinity
  if(root.left != null){
    min_deep=Math.min(minDepth(root.left),min_deep)
  }
  if(root.right != null){
    min_deep=Math.min(minDepth(root.right),min_deep)
  }
  return min_deep+1
};

找到最终的安全状态

找到最终的安全状态
有一个有 n 个节点的有向图,节点按 0 到 n - 1 编号。图由一个 索引从 0 开始 的 2D 整数数组 graph表示, graph[i]是与节点 i 相邻的节点的整数数组,这意味着从节点 i 到 graph[i]中的每个节点都有一条边。

如果一个节点没有连出的有向边,则它是 终端节点 。如果没有出边,则节点为终端节点。如果从该节点开始的所有可能路径都通向一个 终端节点 ,则该节点为 安全节点 。

返回一个由图中所有 安全节点 组成的数组作为答案。答案数组中的元素应当按 升序 排列。
在这里插入图片描述

输入:graph = [[1,2],[2,3],[5],[0],[5],[],[]]
输出:[2,4,5,6]
解释:示意图如上。
节点5和节点6是终端节点,因为它们都没有出边。
从节点2、4、5和6开始的所有路径都指向节点5或6。

var eventualSafeNodes = function(graph) {
  let len=graph.length
  // 标记数组
  // 0:未访问
  // 1:位于递归栈或环上
  // 2:安全
  let color=new Array(len).fill(0)
  let res=[]
  for(let i=0; i<len; i++){
    if(safe(graph,color,i)){
      res.push(i)
    }
  }
  return res
  function safe(graph,color,i){
    if(color[i]>0){
      return color[i] === 2
    }
    // 进来就标记,这是因为可能存在环,
    // 如果我们进来就标记了,后面出现重复遍历的时候,
    // 因为我们是用DFS,所以我们就知道该节点是在一个环路中的
    color[i] = 1
    for(let x of graph[i]){
      // 判断是否有一条路径不能到达终端节点,只要有一条不满足就直接返回false
      if(!safe(graph,color,x)){
        return false
      }
    }
    color[i] = 2
    return true
  }
};

矩阵中的最长递增路径

矩阵中的最长递增路径
给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。
在这里插入图片描述

输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4
解释:最长递增路径为 [1, 2, 6, 9]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值