BFS


目录

  1. BFS 介绍
  2. 计算在网格中从原点到特定点的最短路径长度
  3. 组成整数的最小平方数数量
  4. 最短单词路径

1. BFS 介绍


广度优先搜索一层一层地进行遍历,每层遍历都以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。

需要注意的是,遍历过的节点不能再次被遍历。

第一层:
0 -> {6,2,1,5}
第二层:
6 -> {4}
2 -> {}
1 -> {}
5 -> {3}
第三层:
4 -> {}
3 -> {}

每一层遍历的节点都与根节点距离相同。设 di 表示第 i 个节点与根节点的距离,推导出一个结论:对于先遍历的节点 i 与后遍历的节点 j,有 di <= dj。利用这个结论,可以求解最短路径等最优解 问题:第一次遍历到目的节点,其所经过的路径为最短路径。应该注意的是,使用 BFS 只能求解无权图的最短路径,无权图是指从一个节点到另一个节点的代价都记为 1。
在程序实现 BFS 时需要考虑以下问题:

  • 队列:用来存储每一轮遍历得到的节点;
  • 标记:对于遍历过的节点,应该将它标记,防止重复遍历;

2. 计算在网格中从原点到特定点的最短路径长度


题目描述:1 表示可以经过某个位置,求解从(0,0)位置到(tr,tc)位置的最短路径长度。

public int minPathLength(int[][] grids, int tr, int tc) {final int[][] direction = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};final int m = grids.length, n = grids[0].length;Queue<Pair<Integer, Integer>> queue = new LinkedList<>();queue.offer(new Pair<>(0, 0));int pathLength = 0;while (!queue.isEmpty()) {int size = queue.size();pathLength++;while (size-- > 0) {Pair<Integer, Integer> cur = queue.poll();int cr = cur.getKey(), cc = cur.getValue();grids[cr][cc] = 0; //标记for (int[] d : direction) {int nr = cr + d[0], nc = cc + d[1];if (nr < 0 || nr >= m || nc < 0 || nc >= n || grids[nr][nc] == 0) {continue;}if (nr == tr && nc == tc) {return pathLength;}queue.offer(new Pair<>(nr, nc));}}}return -1;}

注:Pair:配对提供了一种方便方式来处理简单的键值关联,Pair类在javafx.util 包中,类构造函数有两个参数,键及对应值:

    Pair<Integer, String> pair = new Pair<>(1, "One");Integer key = pair.getKey();String value = pair.getValue();

3. 组成整数的最小平方数数量


可以将每个整数看成图中的一个节点,如果两个整数之差为一个平方数,那么这两个整数所在的节点就有一条边。

要求解最小的平方数数量,就是求解从节点 n 到节点 0 的最短路径。

本题也可以用动态规划求解,在之后动态规划部分中会再次出现。

public int numSquares(int n) {List<Integer> squares = generateSquares(n);Queue<Integer> queue = new LinkedList<>();boolean[] marked = new boolean[n + 1];queue.offer(n);marked[n] = true;int level = 0;while (!queue.isEmpty()) {int size = queue.size();level++;while (size-- > 0) {int cur = queue.poll();for (Integer s : squares) {int next = cur - s;if (next < 0) {break;}if (next == 0) {return level;}if (marked[next]) {continue;}marked[next] = true;queue.offer(next);}}}return n;}/*** 生成小于 n 的平方数序列** @param n* @return*/private List<Integer> generateSquares(int n) {List<Integer> squares = new ArrayList<>();int square = 1;int diff = 3;while (square <= n) {squares.add(square);square += diff;diff += 2;}return squares;}

3. 最短单词路径


题目描述:找到一条从 beginWord 到 endWord 的最短路径,每次移动规定为改变一个字符,并且改变之后的字符串必须在 wordList 中。

public int ladderLength(String beginWord, String endWord, java.util.List<String> wordList) {wordList.add(beginWord);int N = wordList.size();int start = N - 1;int end = 0;while (end < N && !wordList.get(end).equals(endWord)) {end++;}if (end == N) {return 0;}List<Integer>[] graphic = buildGraphic(wordList);return getShortestPath(graphic, start, end);}private List<Integer>[] buildGraphic(List<String> wordList) {int N = wordList.size();List<Integer>[] graphic = new List[N];for (int i = 0; i < N; i++) {graphic[i] = new ArrayList<>();for (int j = 0; j < N; j++) {if (isConnect(wordList.get(i), wordList.get(j))) {graphic[i].add(j);}}}return graphic;}private boolean isConnect(String s1, String s2) {int diffCnt = 0;for (int i = 0; i < s1.length() && diffCnt <= 1; i++) {if (s1.charAt(i) != s2.charAt(i)) {diffCnt++;}}return diffCnt == 1;}private int getShortestPath(List<Integer>[] graphic, int start, int end) {Queue<Integer> queue = new LinkedList<>();boolean[] marked = new boolean[graphic.length];queue.add(start);marked[start] = true;int path = 1;while (!queue.isEmpty()) {int size = queue.size();path++;while (size-- > 0) {int cur = queue.poll();for (int next : graphic[cur]) {if (next == end) {return path;}if (marked[next]) {continue;}marked[next] = true;queue.add(next);}}}return 0;}

LeetCode——BFS相关推荐

  1. leetcode BFS(python+c++)

    1.最小基因变化 思路:bfs搜索回溯 python: class Solution:def minMutation(self, start: str, end: str, bank: List[st ...

  2. leetcode:BFS/DFS--腐烂的橘子

    题目: 解法: //Java class Solution {public int orangesRotting(int[][] grid) {int m=grid.length,n=grid[0]. ...

  3. ladder BFS

    leetcode BFS  2015年3月7日  hrwhisper  Leave a comment 649 views  本次题解包括: 126 Word Ladder II 127 Word L ...

  4. 15.使用一样的BFS方法(代码几乎一模一样)解决多道LeetCode题目--542题(01矩阵)1765题(地图中的最高点)994腐烂的橘子

    一.综述 本文总结自己刷LeetCode中遇到的使用BFS方法解决相同类型的题目.(代码几乎是一模一样) 二.01矩阵(LeetCode第542题) class Solution {int[][] d ...

  5. LeetCode N-ary Tree Level Order Traversal(bfs)

    问题:给出一个n叉树,输出层次遍历 思路:bfs 具体代码参考: https://github.com/wuli2496/OJ/tree/master/LeetCode/N-ary%20Tree%20 ...

  6. LeetCode算法题7:DFS和BFS

    文章目录 前言 深度优先搜索算法伪代码: 广度优先搜索算法伪代码: 一.图像渲染 DFS: BFS: 上面BFS算法存在的问题: 修改 1: 修改 2: 二.岛屿的最大面积 DFS: BFS : 三. ...

  7. leetcode 279. 完全平方数 bfs广度优先解法 图解 动态规划解法 c代码

    如题: 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少.示例 1: 输入: n = 12 输出: 3 解释: ...

  8. [LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS | BFS)

    目录: 1.Binary Tree Level Order Traversal - 二叉树层次遍历 BFS 2.Binary Tree Level Order Traversal II - 二叉树层次 ...

  9. leetcode 1345. Jump Game IV | 1345. 跳跃游戏 IV(BFS)

    题目 https://leetcode.com/problems/jump-game-iv/ 题解 好久没做 hard 了,今天时间多,挑战一下.用 lqy 同学的话说,这题叫做 "苦难题& ...

最新文章

  1. C# mongodb 类库
  2. php fastcgi_finish_request用法
  3. C++各大著名程序库
  4. python日期判断星座_python实现根据月份和日期得到星座的方法
  5. 计算机视觉与深度学习 | ORB特征提取:基于OpenCV+Python(附代码)
  6. Bear and Strings
  7. wince Hive注册表实现机制
  8. fields and vector spaces
  9. 苹果mac强大的截图录像工具:Snagit
  10. 74HC595引脚图时序图工作原理及pdf中文资料
  11. java扫雷游戏课程设计素材_练习:仿Windows扫雷游戏
  12. STM32CubeMx之SD卡驱动
  13. JS中文转拼音-兼容多浏览器
  14. 原来射极跟随器还有这个应用
  15. 怎样清空微信全部聊天记录?轻松几步!如何操作清除微信聊天记录?
  16. 教你微信怎么加更多好友的绝佳方法
  17. 菜鸟进阶:在Mac上安装Tomcat+Jenkins
  18. WordPress插件 WP Rocket 缓存火箭加速优化插件 [更新至v2.7.4]
  19. 物联网安全威胁与解决方案调研
  20. Python实现TOPSIS分析法(优劣解距离法)

热门文章

  1. 窄带物联网有望结束技术应用“碎片化”
  2. 多数据源使用spring-data-jpa无法部署到JBoss As Server
  3. 程序人生之我们的故事:十年如歌(9)
  4. CodeForces - 1425D Danger of Mad Snakes(容斥+组合数学)
  5. 洛谷 - P3803 【模板】多项式乘法(FFT/NTT)
  6. CodeForces - 1293C NEKO's Maze Game(思维,水题)
  7. POJ - 3680 Intervals(最大费用最大流+思维建边)
  8. HDU - 1002 A + B Problem II(大数)
  9. swiper高度自适应_小程序自定义导航自适应高度
  10. uva1624knots