
BFS
软件园里卖煎饼
以文载意,以理铸心
展开
-
每日一题:1609. 奇偶树
解题思路广度优先搜索BFS代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, Tr原创 2021-12-25 15:47:58 · 319 阅读 · 0 评论 -
第 67 场双周赛T3.5936. 引爆最多的炸弹
解题思路首先找出当前炸弹能引爆的炸弹利用Map存储当前炸弹能引爆的炸弹编号(需要注意判断能否引爆的函数中要使用long类型,不然会产生溢出问题)根据Map集合,选择不同的炸弹作为起爆点,进行DFS或BFS找到最佳起爆点代码//DFS解法class Solution { public int maximumDetonation(int[][] bombs) { int ans = Integer.MIN_VALUE; //记录炸弹编号和其可以引爆的炸弹原创 2021-12-12 14:31:14 · 361 阅读 · 0 评论 -
第 264 场周赛Cider T4.2050. 并行课程 III
解题思路DFS分为以下几个步骤1.构建邻接表和entry入度数组2.将所有entry为0的点入队,作为起点3.开始进行BFS,中心思想为用clone数组记录当前课程的实际所需完成时间课程实际完成时间 = 前置课程完成所需最大时间 + 课程本身学习所需要时间代码class Solution { public int minimumTime(int n, int[][] relations, int[] time) { int[] clone = time.clone();原创 2021-12-11 10:38:30 · 534 阅读 · 0 评论 -
面试题 04.03. 特定深度节点链表
解题思路BFS构造链表即可代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } *//** * Definition for singly-linked list. * public class ListN原创 2021-12-08 11:37:11 · 397 阅读 · 0 评论 -
面试题 04.01. 节点间通路
解题思路构建有向连通图,然后进行BFS,如果能到达target就返回true 否则返回false代码class Solution { public boolean findWhetherExistsPath(int n, int[][] graph, int start, int target) { Map<Integer, HashSet<Integer>> map = new HashMap<>(); for (int i原创 2021-12-08 11:36:33 · 289 阅读 · 0 评论 -
第270场周赛灵动科技.T3从二叉树一个节点到另一个节点每一步的方向
解题思路将二叉树转为图,并规定1代表父子关系,2代表左子节点,3代表右子节点总的来说很巧妙,但是需要优化,否则会超时代码/** * @author bakazhou * @description * @date 2021年12月07日 14:06 **/class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) {原创 2021-12-07 15:05:39 · 121 阅读 · 0 评论 -
每日一题:1034. 边界着色
解题思路BFS即可,题目描述有问题,没用讲清楚边界区域的意思,但总体思想基本为BFS找出所有边界上的点,然后对边界点进行染色即可代码class Solution { public int[][] colorBorder(int[][] grid, int row, int col, int color) { int m = grid.length, n = grid[0].length; boolean[][] visited = new boolean[m][原创 2021-12-07 09:56:59 · 79 阅读 · 0 评论 -
每日一题:700. 二叉搜索树中的搜索
解题思路两种思路BFS和DFS,因为是二叉搜索树,所以可以想到DFS加入条件判断肯定比BFS快代码//DFSclass Solution { public TreeNode searchBST(TreeNode root, int val) { return dfs(root,val); } public TreeNode dfs(TreeNode root,int val) { if (root.val == val) {原创 2021-11-26 10:43:52 · 310 阅读 · 1 评论 -
每日一题:559. N 叉树的最大深度
解题思路层次遍历即可代码/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() {} public Node(int _val) { val = _val; } public Node(int _val, List<Node> _children) {原创 2021-11-21 15:14:54 · 365 阅读 · 0 评论 -
每日一题:397. 整数替换
解题思路BFS解决代码class Solution { public int integerReplacement(int n) { if (n == 1){ return 0; } if(n == 2147483647){ return 32; } LinkedList<Integer> queue = new LinkedList<>();原创 2021-11-20 12:31:58 · 347 阅读 · 0 评论 -
最短路径问题:126. 单词接龙 II
解题思路BFS解决主要在于helper函数找出所有的可转换单词与127的主要区别就是需要记录路径,因此将Queue的类型替换为List代码class Solution { public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) { List<List<String>> ans = n原创 2021-11-04 11:28:27 · 109 阅读 · 2 评论 -
最短路径问题:127单词接龙
解题思路BFS解决,主要在于helper函数,找出所有可以变换的单词类型,且时间复杂度不高代码class Solution { public int ladderLength(String beginWord, String endWord, List<String> wordList) { int step = 0; //记录wordList当中的所有单词 HashSet<String> word原创 2021-11-04 11:27:57 · 78 阅读 · 1 评论 -
博乐科技周赛T3:2059. 转化数字的最小运算数
解题思路BFS解决代码class Solution { public int minimumOperations(int[] nums, int start, int goal) { Set<Integer> set = new HashSet<>(); LinkedList<Integer> queue = new LinkedList<>(); queue.add(start);原创 2021-11-01 18:07:51 · 129 阅读 · 0 评论 -
leetcode.210. 课程表 II
解题思路利用图的入度这一特性,进行bfs如果一门课程入度为0,那么说明这门课程可以学习了,因此每一轮都将所有可以学习的课程学习完,并将对应的后置课程入度-1,如此即可代码class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { int[][] edge = new int[numCourses][numCourses];//构造邻接矩阵 int[] entr原创 2021-07-02 11:33:29 · 89 阅读 · 0 评论 -
leetcode.207. 课程表
解题思路利用图的入度这一特性,进行bfs如果一门课程入度为0,那么说明这门课程可以学习了,因此每一轮都将所有可以学习的课程学习完,并将对应的后置课程入度-1,如此即可代码class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { int[][] edge = new int[numCourses][numCourses];//构造邻接矩阵 int[] en原创 2021-07-02 11:32:25 · 114 阅读 · 0 评论 -
leetcode.45. 跳跃游戏 II
解题思路因为要返回最少的跳跃次数,并且一定可以到达,所以采用BFS每轮循环找到所能跳跃到的所有点,直到跳到终点位置代码class Solution { public int jump(int[] nums) { LinkedList<Integer> queue = new LinkedList<>(); Set<Integer> set = new HashSet<>(); int step =原创 2021-07-01 16:45:27 · 97 阅读 · 0 评论 -
每日一题:LCP 07. 传递信息(BFS)
解题思路BFS1.构造图,n*n的矩阵,连通则为12.建立队列,将每次能到达的点入队,并将步数+13.如果步数已经到k,且队列中取出点为n-1,则ans+1代码class Solution { public int numWays(int n, int[][] relation, int k) { int[][] road = new int[n][n]; for(int i=0;i<relation.length;i++){原创 2021-07-01 10:40:51 · 86 阅读 · 0 评论 -
每日一题:773. 滑动谜题
解题思路BFS思路1 2 34 5 0变成字符串后就是1 2 3 4 5 0所以0交换位置就是字符串中交换0的位置代码class Solution { public int slidingPuzzle(int[][] board) { int step = 0; String cur = beString(board); if (cur.equals("123450")){//当前已经满足 return 0;原创 2021-06-28 14:14:05 · 122 阅读 · 1 评论 -
每日一题:815. 公交路线
解题思路利用BFS的思路代码class Solution { public int numBusesToDestination(int[][] routes, int source, int target) { Set<Integer> set = new HashSet<>(); Map<Integer,List<Integer>> map = new HashMap<>();//In原创 2021-06-28 14:09:44 · 132 阅读 · 0 评论 -
每日一题:279. 完全平方数
解题思路DFS超时,最终使用BFS代码class Solution { public int numSquares(int n) { int step=0; boolean[] flag = new boolean[n]; LinkedList<Integer> queue = new LinkedList<>(); queue.add(n); while (!queue.isEmpty()原创 2021-06-16 14:50:42 · 151 阅读 · 1 评论 -
每日一题:993. 二叉树的堂兄弟节点
解题思路利用BFS进行遍历因为树中所有值为唯一,因此不会有重复的节点,所以可以直接记录x和y父节点的值,以及他们所在的层数,最终判断层级是否相等,父节点是否不同代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int原创 2021-05-17 10:00:21 · 69 阅读 · 0 评论 -
每日任务:二叉树.515. 在每个树行中找最大值
解题思路bfs找到每一行的最大值并加入到ans中,最后返回代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, T原创 2021-04-22 17:28:20 · 110 阅读 · 1 评论 -
每日任务:二叉树.513. 找树左下角的值
解题思路bfs层序遍历,取到最后一行的最左边的即可代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeN原创 2021-04-22 17:27:15 · 84 阅读 · 0 评论 -
每日任务:二叉树.103. 二叉树的锯齿形层序遍历
解题思路利用bfs进行层序遍历,利用dir来做判断,当前应该是从左至右还是从右至左代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNod原创 2021-04-22 17:25:52 · 64 阅读 · 0 评论 -
每日任务:二叉树.623. 在二叉树中增加一行
解题思路利用bfs,找到对应的层数,再将需要添加的层加入其中代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val,原创 2021-04-20 16:13:34 · 105 阅读 · 0 评论 -
每日任务:二叉树.199. 二叉树的右视图
解题思路bfs,然后取每次队列中的最后一个节点出来代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeN原创 2021-04-20 15:02:08 · 77 阅读 · 0 评论 -
每日任务:二叉树.222. 完全二叉树的节点个数
解题思路bfs将每层的节点数累加代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left,原创 2021-04-20 15:01:19 · 60 阅读 · 0 评论 -
BFS解题思路及模板
解题模板// 计算从起点 start 到终点 target 的最近距离int BFS(Node start, Node target) { Queue<Node> q; // 核心数据结构 Set<Node> visited; // 避免走回头路 q.offer(start); // 将起点加入队列 visited.add(start); int step = 0; // 记录扩散的步数 while (q not empty)原创 2021-04-13 21:35:54 · 166 阅读 · 0 评论 -
BFS:LeetCode.111. 二叉树的最小深度
解题思路使用bfs探索,如果找到了叶子节点就直接返回深度~代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, T原创 2021-04-13 21:30:57 · 85 阅读 · 0 评论 -
BFS:LeetCode.752. 打开转盘锁
解题思路1.bfs基本的框架2.不能走回头路3.判断是否转到了死亡数字4.判断是否转到了正确数字5.需要保证每个位子上的数字向上向下转的情况都产生能完成以上五点这道题基本上就解决了代码class Solution { public int openLock(String[] deadends, String target) { Set<String> words = new HashSet<>(); for (int i=0;i原创 2021-04-13 21:29:44 · 83 阅读 · 0 评论 -
每日一题:783. 二叉搜索树节点最小距离
解题思路两种解法,但是大致思路相同第一种是dfs将每个点的值加入到一个list中,然后对list进行排序,再找出最小差值第二种是bfs将每个点的值加入到一个list中,然后对list进行排序,再找出最小差值代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(原创 2021-04-13 16:50:30 · 80 阅读 · 0 评论 -
每日一题:1631. 最小体力消耗路径
二分查找加bfs public int minimumEffortPath(int[][] heights) { int length = heights.length; int weight = heights[0].length; int right = 99999999,left = 0;//代表的是最小体力消耗 int [][]dis = new int[][]{{0,-1},{0,1},{-1,0},{1,0}};//上下左右四个方原创 2021-02-04 13:02:57 · 215 阅读 · 0 评论 -
每日一题:778. 水位上升的泳池中游泳
二分查找加上bfs,直到所找到的值既为最小也能到达右下角为止public int swimInWater(int[][] grid) { int[][] dir = new int[][]{{0,1},{0,-1},{1,0},{-1,0}}; int weight = grid.length; int length = grid[0].length; int left=Math.max(grid[0][0],grid[weight-1][l原创 2021-02-04 12:58:47 · 164 阅读 · 0 评论 -
Leetcode994. 腐烂的橘子 bfs解决
在给定的网格中,每个单元格可以有以下三个值之一:值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。解题思路:其实就是一个传染问题,腐烂橘子会传染新鲜橘子,直到传染完毕或者无法传染为止1.BFSclass Soluti...原创 2020-03-27 10:54:08 · 162 阅读 · 1 评论 -
迷宫问题的DFS解决和BFS解决
迷宫问题定义一个二维数组:int maze[5][5]0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。Input一个5 × 5的二维数组,表示一个迷宫。数据保证有...原创 2020-03-23 20:24:35 · 533 阅读 · 3 评论 -
BFS与DFS笔记整理
参考:https://blog.youkuaiyun.com/yishuige/article/details/51769997什么时候用DFS,什么时候用BFS?二维数组的题目,N小于20的,适用DFS。而一般 N<= 200,N<=1000这种,一定不可能用DFS去做。而且并不只是整个题目不能用DFS,其中的每一步也不能使用DFS。BFS的基本步骤1.将初始点(一个或多个)加入一个集合...原创 2020-03-22 22:20:50 · 469 阅读 · 0 评论