【LeetCode】BFS 总结
BFS(广度优先搜索) 常用来解决最短路径问题。
第一次便利到目的节点时,所经过的路径是最短路径。
几个要点:
- 只能用来求解无权图的最短路径问题
 - 队列:用来存储每一层便利得到的节点
 - 标记:对于遍历过的结点,应将其标记,以防重复访问
 
279. 完全平方数
题目描述
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1:
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4.
示例 2:
输入: n = 13
输出: 2
解释: 13 = 4 + 9.
解题思路
从 0 到 n 有 n+1 个整数,把这 n+1 个整数看做是节点。如果两个节点之间的差是一个完全平方数,我们就说这两个节点之间是有连接的。通过这个思路我们就可以建立一张图。
找到 n 到 0 的最短路径,我们就找到了 n 至少需要几个完全平方数组成。
public int numSquares(int n) {
    List<Integer> squares = generateSquares(n);
    Queue<Integer> queue = new LinkedList<>();
    boolean[] marked = new boolean[n + 1];
    queue.add(n);
    marked[n] = true;
    int level = 0;
    while(!queue.isEmpty()){
        int size = queue.size();
        level++;
        while(size-- >0){
            int cur = queue.poll();
            for (int s : squares){
                int next = cur - s;
                if (next < 0)
                    break;
                if (next == 0)
                    return level;
                if (marked[next])
                    continue;
                queue.add(next);
                marked[next] = true;
            }
        }
    }
    return n;
}
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;
}
127. 单词接龙
题目描述
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord到 endWord 的最短转换序列的长度。转换需遵循如下规则:
- 每次转换只能改变一个字母。
 - 转换过程中的中间单词必须是字典中的单词。
 
说明:
- 如果不存在这样的转换序列,返回 0。
 - 所有单词具有相同的长度。
 - 所有单词只由小写字母组成。
 - 字典中不存在重复的单词。
 - 你可以假设 beginWord 和 endWord 是非空的,且二者不相同。
 
示例 1:
输入:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]
输出: 5
解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog",
     返回它的长度 5。
示例 2:
输入:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]
输出: 0
解释: endWord "cog" 不在字典中,所以无法进行转换。
解题思路
如果两个单词在对应位置上只有一个字母是不同的,我们就说这两个单词是连接的。按照这个定义,我们可以建立一张图。对这张图进行 BFS 就可以找到从 beginWord 到 endWord 的最短转换序列的长度。
注意,字典中是不包含beginWord的,我们需要将其手动加入再建立图。
public int ladderLength (String beginWord, String endWord, 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 diff = 0;
    for (int i = 0; i < s1.length() && diff <= 1; i++) {
        if (s1.charAt(i) != s2.charAt(i)) {
            diff++;
        }
    }
    return diff == 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 pathLength = 1;
    while (!queue.isEmpty()) {
        int size = queue.size();
        pathLength++;
        while (size-- > 0) {
            int cur = queue.poll();
            for (int next : graphic[cur]) {
                if (next == end) {
                    return pathLength;
                }
                if (marked[next]) {
                    continue;
                }
                queue.add(next);
                marked[next] = true;
            }
        }
    }
    return 0;
}
												
											【LeetCode】BFS 总结的更多相关文章
- [LeetCode] BFS解决的题目
		
一.130 Surrounded Regions(https://leetcode.com/problems/surrounded-regions/description/) 题目: 解法: 这道题 ...
 - leetcode BFS解题思路
		
Word Ladder 思路一:单向bfs, 使用visited数组记录哪些已经访问过了, 访问过的就不允许再次入队, 同时这里想到的是使用26个英文字母,枚举可能的取值, 类似brute force ...
 - leetcode BFS
		
1. word ladder class Solution { public: int ladderLength(string beginWord, string endWord, unordered ...
 - [LintCode]——目录
		
Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...
 - [LeetCode] 130. Surrounded Regions_Medium tag: DFS/BFS
		
Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...
 - [LeetCode] 849. Maximize Distance to Closest Person_Easy tag: BFS
		
In a row of seats, 1 represents a person sitting in that seat, and 0 represents that the seat is emp ...
 - [LeetCode] 513. Find Bottom Left Tree Value_ Medium tag: BFS
		
Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / \ 1 ...
 - [LeetCode] 787. Cheapest Flights Within K Stops_Medium tag: Dynamic Programming, BFS, Heap
		
There are n cities connected by m flights. Each fight starts from city u and arrives at v with a pri ...
 - [LeetCode] 821. Shortest Distance to a Character_Easy tag: BFS
		
Given a string S and a character C, return an array of integers representing the shortest distance f ...
 - [LeetCode] 675. Cut Off Trees for Golf Event_Hard tag: BFS
		
You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...
 
随机推荐
- JVM系列(1)- JVM常见参数及堆内存分配
			
常见参数配置 基于JDK1.6 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收模式 -XX:+PrintGCDetails 打印更详细的GC日志 ...
 - JAVA基础知识(八)值传递与引用传递
			
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...
 - Android 打包时 Keep 住某些方法或类
			
# ${android_sdk}/tools/proguard/proguard-android.txt # Understand the @Keep support annotation. -kee ...
 - Javaweb表格加载---DataTable
			
Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 使用 jQuery Datatable 构造数据列表,并且增加或者隐藏相应的列,已达 ...
 - intellIJ IDEA学习笔记
			
如果你初次用idea,毫无目的的度娘如何使用IDEA 浪费的将会是大量的时间.为以表诚意, 上一套IDEA教学视频,以表我诚意.(下载地址:https://pan.baidu.com/s/1g ...
 - 容易上手搭建vue2.0开发环境
			
第一步:安装node 前端开发框架和环境都是需要 Node.js ,先安装node.js开发环境,vue的运行是要依赖于node的npm的管理工具来实现,下载https://nodejs.org/en ...
 - 为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】
			
每篇一句 胡适:多谈些问题,少聊些主义 前言 Spring MVC和MyBatis作为当下最为流行的两个框架,大家平时开发中都在用.如果你往深了一步去思考,你应该会有这样的疑问: 在使用Spring ...
 - c语言实现基本的数据结构(一) 线性表
			
#include <stdio.h> #include <tchar.h> #include <stdlib.h> #define LIST_INIT_SIZE 1 ...
 - 访问CGI程序时不添加 /cgi-bin/ 目录也可访问
			
配置如下 <VirtualHost *:80> DocumentRoot D:\web_root\test ServerName www.test.com <Directory /& ...
 - 分布式系统的一致性级别划分及Zookeeper一致性级别分析
			
最近在研究分布式系统的一些理论概念,例如关于分布式系统一致性的讨论,看了一些文章我有一些不解.大多数对分布式系统一致性的划分是将其分为三类:强一致性,顺序一致性以及弱一致性.强一致性(Strict C ...