思路及解答DFS(深度优先搜索)

📅 2026/7/1 7:12:02
思路及解答DFS(深度优先搜索)
深度优先搜索算法也就是 DFS ,⾸先需要初始化数组注意是 boolean 类型的⼆元数组。边初始化边计算位数的和判断如果⼤于等于阈值的话就直接置为 true 也就是已经被访问到但是这⼀部分计⼊结果。然后遍历每⼀个元素只要 i j 不在合法的索引范围或者是已经被访问过都会直接返回false 。否则的话可访问的数量 1 并且递归遍历上下左右四个元素返回最终的可访问的个数。DFS 会优先同⼀个⽅向⼀直⾛下去不撞南墙不回头直到条件不满⾜的时候才会回头。回头之后每次只会回头⼀步往另外⼀个⽅向去同样是⼀头扎进去。假设有⼀个 4 x 4 的⽅格从第⼀个开始遍历假设遍历顺序是上右下左那么遍历的顺序如下javapublic class Solution { public int movingCount(int threshold, int rows, int cols) { if (rows 0 cols 0) { boolean[][] visited new boolean[rows][cols]; for (int i 0; i rows; i) { for (int j 0; j cols; j) { // 如果⼤于阈值设置已被访问过 visited[i][j] ((getSum(i) getSum(j)) threshold); } } return getNum(visited, 0, 0, 0); } return 0; } // 获取可以被访问的个数 private int getNum(boolean[][] visited, int i, int j, int count) { if (i 0 || j 0 || i visited.length || j visited[0].length || visited[i][j]) { return count; } count; visited[i][j] true; count getNum(visited, i, j 1, count); count getNum(visited, i, j - 1, count); count getNum(visited, i 1, j, count); count getNum(visited, i - 1, j, count); return count; } // 计算位数之和 private int getSum(int num) { int result 0; while (num 0) { result result num % 10; num num / 10; } return result; } }时间复杂度最坏的情况是将所有的格⼦都遍历⼀遍 O(m*n) 。空间复杂度借助了额外的空间保存是否被访问过同样为O(m*n) 。BFS⼴度优先搜索⼴度优先搜索也就是没进⾏⼀步优先搜索当前点的各个⽅向上的点不急着往下搜索等搜索完当前点的各个⽅向的点再依次把之前搜索的点取出来同样先搜索周边的点...这样直到所有都被搜索完成。同样有⼀个 4 x 4 的⽅格从第⼀个开始遍历假设遍历顺序是上右下左那么遍历的顺序如下在上⾯的过程图示中我们可以发现访问是有顺序的每遍历⼀个新的⽅块都会标⼀个顺序