LeetCode DFS、BFS篇(102、200、111、752)
102. 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
//思路1BFS,优化广度遍历,一层一层放进deque进行遍历,遍历完一层就用list装完加入res
//思路2DFS,每一层递归都用index做标记
solution1 BFS 迭代
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
ArrayDeque<TreeNode> deque = new ArrayDeque<>();
if (root != null) {
deque.add(root);
}
while (!deque.isEmpty()){
int n = deque.size();
List<Integer> level = new ArrayList<>();
for (int i = 0;i<n;i++){
TreeNode node = deque.pop();
level.add(node.val);
if (node.left!=null){
deque.add(node.left);
}
if (node.right!=null){
deque.add(node.right);
}
}
res.add(level);
}
return res;
}
}
solution 2 DFS 递归
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null){
return res;
}
dfs(res,root,1);
return res;
}
public void dfs(List<List<Integer>> res,TreeNode node,int index){
if (res.size()<index){
res.add(new ArrayList<Integer>());
}
res.get(index-1).add(node.val);
if (node.left != null){
dfs(res,node.left,index+1);
}
if (node.right != null){
dfs(res,node.right,index+1);
}
}
}
200. 岛屿数量
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:
[
['1','1','1','1','0'],
['1','1','0','1','0'],
['1','1','0','0','0'],
['0','0','0','0','0']
]
输出: 1
示例 2:
输入:
[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
//思路1:用DFS把1以及周围的点变为0,用静态变量g保存grid,可以让不太的方法修改它
//思路2:用BFS将1以及周围变为0
solution1 DFS
class Solution {
char[][] g;
public int numIslands(char[][] grid) {
int res = 0;
g = grid;
int re = 0;
for (int i=0; i<g.length; i++){
for (int j=0; j < g[i].length; j++){
if (g[i][j] == '1') {
sink(i,j);
res ++;
}
}
}
return res;
}
public void sink(int i,int j){
//终止条件
if(i < 0 || j < 0 || i >= g.length || j >= g[0].length || g[i][j] == '0') return;
//当前层
g[i][j] = '0';
//下一层
sink(i + 1, j);
sink(i, j + 1);
sink(i - 1, j);
sink(i, j - 1);
}
}
solution2 BFS
class Solution {
char[][] g;
public int numIslands(char[][] grid) {
int res = 0;
g = grid;
for (int i=0; i<g.length; i++){
for (int j=0; j < g[i].length; j++){
if (g[i][j] == '1') {
bfs(i,j);
res ++;
}
}
}
return res;
}
public void bfs(int i,int j){
g[i][j] = '0';
int x = g.length;
int y=g[0].length;
int code = i*y + j;
ArrayDeque<Integer> deque = new ArrayDeque<>();
deque.push(code);
while(!deque.isEmpty()){
code = deque.pop();
int n = code/y;
int m = code%y;
if (n>0 && g[n-1][m] == '1'){
deque.push((n-1)*y+m);
g[n-1][m] = '0';
}
if (n<x-1 && g[n+1][m] == '1'){
deque.push((n+1)*y+m);
g[n+1][m] = '0';
}
if (m>0 && g[n][m-1] == '1'){
deque.push(n*y+(m-1));
g[n][m-1] = '0';
}
if (m<y-1 && g[n][m+1] == '1'){
deque.push(n*y+(m+1));
g[n][m+1] = '0';
}
}
}
}
111. 二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最小深度 2.
class Solution {
public int minDepth(TreeNode root) {
if (root == null) return 0;
Deque<TreeNode> dq = new LinkedList<>();
//往队列添加元素
dq.offer(root);
int depth = 1;
while( !dq.isEmpty()){
int len = dq.size();
//以当前队列中的所有节点向四周扩撒
for(int i = 0; i < len; i ++){
TreeNode node = dq.poll();
if(node.left == null && node.right == null){
return depth;
}
if (node.left != null){
dq.offer(node.left);
}
if (node.right != null){
dq.offer(node.right);
}
}
//增加深度
depth++;
}
return depth;
}
}
// 思路1: 运用BFS,以面单位进行搜索,使用dq进行保存
752. 打开转盘锁
你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' 。每个拨轮可以自由旋转:例如把 '9' 变为 '0','0' 变为 '9' 。每次旋转都只能旋转一个拨轮的一位数字。
锁的初始数字为 '0000' ,一个代表四个拨轮的数字的字符串。
列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。
字符串 target 代表可以解锁的数字,你需要给出最小的旋转次数,如果无论如何不能解锁,返回 -1。
示例 1:
输入:deadends = ["0201","0101","0102","1212","2002"], target = "0202"
输出:6
解释:
可能的移动序列为 "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202"。
注意 "0000" -> "0001" -> "0002" -> "0102" -> "0202" 这样的序列是不能解锁的,
因为当拨动到 "0102" 时这个锁就会被锁定。
示例 2:
输入: deadends = ["8888"], target = "0009"
输出:1
解释:
把最后一位反向旋转一次即可 "0000" -> "0009"。
示例 3:
输入: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888"
输出:-1
解释:
无法旋转到目标数字且不被锁定。
示例 4:
输入: deadends = ["0000"], target = "8888"
输出:-1
提示:
死亡列表 deadends 的长度范围为 [1, 500]。
目标数字 target 不会在 deadends 之中。
每个 deadends 和 target 中的字符串的数字会在 10,000 个可能的情况 '0000' 到 '9999' 中产生。
solution1
class Solution {
public int openLock(String[] deadends, String target) {
//死亡之组
Set<String> deads = new HashSet<String>();
for (String s:deadends){ deads.add(s);}
//遍历队列
Deque<String> dq = new LinkedList<String>();
//已遍历
Set<String> visited = new HashSet<String>();
//深度
int depth = 0;
dq.offer("0000");
visited.add("0000");
while(!dq.isEmpty()){
int sz = dq.size();
// 以面为单位遍历
for (int i = 0; i < sz; i++){
String curr = dq.poll();
if (deads.contains(curr)) continue;
if (curr.equals(target)) return depth; //不能用==
for (int j = 0; j < 4; j++){
String plus = plusOne(curr,j);
if (!visited.contains(plus)){
dq.offer(plus);
visited.add(plus);
}
String minus = minusOne(curr,j);
if (!visited.contains(minus)){
dq.offer(minus);
visited.add(minus);
}
}
}
depth++;
}
return -1;
}
// 目标转盘+1
private String plusOne(String s,int j){
char[] c = s.toCharArray();
if (c[j] == '9'){
c[j] = '0';
}else{
c[j]+=1;
}
return new String(c);
}
// 目标转盘-1
private String minusOne(String s,int j){
char[] c = s.toCharArray();
if (c[j] == '0'){
c[j] = '9';
}else{
c[j]-=1;
}
return new String(c);
}
}
//运用BFS,以“0000”为根,所有转动情况为根的子节点
LeetCode DFS、BFS篇(102、200、111、752)的更多相关文章
- [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)
695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...
- [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 559]N叉树的最大深度Maximum Depth of N-ary Tree DFS/BFS模板
题目 https://leetcode.com/problems/maximum-depth-of-n-ary-tree/ N叉树的最大深度 Given a n-ary tree, find its ...
- DFS/BFS+思维 HDOJ 5325 Crazy Bobo
题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...
- ID(dfs+bfs)-hdu-4127-Flood-it!
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...
- HDU 4771 (DFS+BFS)
Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...
- DFS/BFS视频讲解
视频链接:https://www.bilibili.com/video/av12019553?share_medium=android&share_source=qq&bbid=XZ7 ...
- POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE
POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...
- POJ2308连连看dfs+bfs+优化
DFS+BFS+MAP+剪枝 题意: 就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路: 首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...
随机推荐
- CCF PTA&中国科教工作者协会联合认证
首页 项目简介 条例规定 通知公告 组织机构 服务中心 联系我们 登录|注册 当前位置:首页 > 新闻动态 开放报名:CCF PTA&中国科教工作者协会联合认证 发布时间: 2023-0 ...
- How to install Django¶
This document will get you up and running with Django. Install Python Being a Python Web framework, ...
- LVS+keepalived配置高可用架构和负载均衡机制(1)
一.基础知识 1. 四层负载均衡(基于IP+端口的负载均衡) 所谓四层负载均衡,也就是主要通过报文中的目标ip地址和端口,再加上负载均衡设备设置的服务器选择方式(分发策略,轮询),决定最终选择的内部服 ...
- js下IE和FF的一些兼容写法总结
一.脚本差异: 1.事件绑定:addEventListener 与 attachEvent 事件处理函数中this指向不同, IE中指向window 2.获取事件对象 :事件处理函数 win ...
- CSS单位px、em、rem及它们之间的换算关系
作者:WangMin 格言:努力做好自己喜欢的每一件事 国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者的区别与优势是什么?接下来我们就来学习一下吧! 单位px.em.rem分 ...
- Redis Functions 介绍之一
Redis提供了编程接口(programming interface)可以让你在Redis服务器端执行客户的脚本. 一个重大的变化就是从Redis 7开始,你可以选择使用Redis Functions ...
- Mac 终端命令查看WiFi连接日志【原创】
写这篇文章的原因是因为经常通过钉钉打上班卡忘记打卡了,我们标准上班时间是上午8:00-10:00 ,对应下班时间是 17:00-19:00 ,有时8:30到公司,就开始忙碌了,作为程序员有时后一忙就 ...
- Markdown & typora 速查
Markdown & typora 速查 一级标题 # 一级标题 说明:#数量表示几级标题,如二级标题为"## 二级标题",支持到6级标题,#和标题中间有一个空格 typo ...
- UIPath流程控制
应当仔细地观察,为的是理解:应当努力地理解,为的是行动. UIPath程序中流程控制主要包括条件语句.循环语句以及中断语句.下面我们一一学习这些语句在RPA流程设计中的使用. 1. 条件判断 if ...
- ES到底是个什么东西
概念:全文检索服务器(是基于Lucene开发的全文检索服务器),它可以近乎实时存储.检索数据,底层仍然是Lucene来实现的所以索引和搜索功能,他的目的是通过的简单的RESTFul API 来隐藏Lu ...