LeetCode:733. 图像渲染(java版)——BFS是渣男/女,DFS是方知有
题外话:看完题目,是不是一头雾水。有疑问就对了,不知道出题者的语文老师看了有啥感想。
题目意思其实很简单,就是给你一个初始坐标点(sr,sc),找和该点附近像素值相同的坐标,而这附近的定义就是上下左右,不包括斜对角;然后将这些像素值替换为新的像素值newColor。
虽然题目是easy,但是对我而言不是easy༼༎ຶᴗ༎ຶ༽(so sad...
话不多说,直接看解题方法吧!
方法1:广度优先搜索BFS(Broad First Search)
我们从给定的起点开始,进行广度优先搜索。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格加入队列,并将该方格的颜色更新,以防止重复入队。
注意:因为初始位置的颜色会被修改,所以我们需要保存初始位置的颜色,以便于之后的更新操作。
我愿称广度优先搜索为鱼塘大法!queue是鱼塘,先广撒网(for);再判断是非(if)
虽为鱼塘大法,但是我觉得好用且易理解,reject歧视算法(假正经~
class Solution {public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {// 题意:油漆桶工具// 1. 广度优先搜索——queueint[] dx={0,1,0,-1};int[] dy={1,0,-1,0}; // 两个数组结合起来看就是右,下,左,上int m=image.length; // row numberint n=image[0].length; // column numerQueue<int[]> queue=new LinkedList<>();int oldColor=image[sr][sc];if(oldColor==newColor) return image; //特殊情况queue.offer(new int[]{sr, sc});image[sr][sc]=newColor;while(!queue.isEmpty()){ // 广度遍历符合条件的像素点坐int[] xy=queue.poll();int x=xy[0],y=xy[1];for(int i=0;i<4;i++){ // 先广撒网,再判断是非int mx=x+dx[i],my=y+dy[i];if(mx>=0 && mx<m && my>=0 && my<n && image[mx][my]==oldColor){ // 判断是非image[mx][my]=newColor;queue.offer(new int[]{mx,my});}}}return image;}
}
方法2:假 深度优先搜索
为什么是假?因为本质上还是有广度优先搜索的影子,没有按照一个方向走到底,只是将存储搜索过的坐标数据结构从队列queue变成栈stack。其实本质还是跟方法1一样的。
class Solution {public int[][] floodFill(int[][] image, int sr, int sc, int newColor) { // 2. 假深度优先搜索——stackint[] dx={0,1,0,-1};int[] dy={1,0,-1,0}; // 两个数组结合起来看就是右,下,左,上int m=image.length; // row numberint n=image[0].length; // column numerDeque<int[]> stack=new LinkedList<>();int oldColor=image[sr][sc];if(oldColor==newColor) return image;stack.push(new int[]{sr,sc});image[sr][sc]=newColor;while(!stack.isEmpty()){ // 广度遍历符合条件的像素点坐int[] xy=stack.pop();int x=xy[0],y=xy[1];for(int i=0;i<4;i++){int mx=x+dx[i],my=y+dy[i];if(mx>=0 && mx<m && my>=0 && my<n && image[mx][my]==oldColor){image[mx][my]=newColor;stack.push(new int[]{mx,my});}}}return image;}
}
方法3:深度优先搜索DFS(Deep First Search)——递归
我们从给定的起点开始,进行深度优先搜索。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格的颜色更新,以防止重复搜索;如果不相同,则进行回溯。
注意:因为初始位置的颜色会被修改,所以我们需要保存初始位置的颜色,以便于之后的更新操作。
“斯人若彩虹,遇上方知有”
深度优先搜索是彩虹:先排除不合适的(直接return);再选择合适的(if),如果再不合适就换(for)
DFS是心上人,可遇不可求,想想就好~~
class Solution {int[] dx={0,1,0,-1};int[] dy={1,0,-1,0}; // 两个数组结合起来看就是右,下,左,上public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {// 3.深度优先——递归int oldColor=image[sr][sc];if(newColor!=oldColor) dfs(image,sr,sc,newColor,oldColor);return image;}public void dfs(int[][] image, int x, int y, int newColor, int oldColor){int m=image.length; // row numberint n=image[0].length; // column numberif(!(x>=0 && x<m && y>=0 && y<n)) return; // 先排除不合适的if(image[x][y]!=oldColor) return;if(image[x][y]==oldColor){ // 先判断是非,不合适再换image[x][y]=newColor;for (int i=0;i<4;i++){ // 换int mx=x+dx[i],my=y+dy[i];dfs(image,mx,my,newColor,oldColor);}}}
}
参考:
力扣
LeetCode:733. 图像渲染(java版)——BFS是渣男/女,DFS是方知有相关推荐
- LeetCode 733. 图像渲染(DFS/BFS)
文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 1. 题目 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr ...
- 733.图像渲染(主讲题意)
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newCol ...
- 695. 岛屿的最大面积(适合 初学者 理解的java版BFS)
文章目录 BFS 给你一个大小为 m x n 的二进制矩阵 grid . 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻.你可以 ...
- leetcode -43 -字符串相乘 -java版
文章目录 题目 代码 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = &quo ...
- 文巾解题 733. 图像渲染
1 题目描述 2 解题思路 注意一点,如果第一个要渲染的点,颜色和要渲染成的颜色是一样的,那么我们直接返回.不然的话会死循环. 2.1 广度优先遍历 广搜是使用队列来实现的 class Solutio ...
- leetcode 461. 汉明距离(Java版)
题目 https://leetcode-cn.com/problems/hamming-distance/ 题解 使用 Java 中的按位异或 ^ 运算符:https://www.baeldung.c ...
- java创建对象new后面为啥可以传入参数_你有认真了解过自己的“Java对象”吗?渣男...
对象在 JVM 中是怎么存储的 对象头里有什么? 作为一名 Javaer,生活中的我们可能暂时没有对象,但是工作中每天都会创建大量的 Java 对象,你有试着去了解下自己的"对象" ...
- 目标检测Part2+Leetcode(733)
目标检测Part2 目标检测Part2(R-FCN,Yolo) 1.R-FCN 1.1 检测网络的变换敏感性 和 分类网络的变换不变性 1.2 设计动机(模型优势) 1.3 R-FCN架构分析-算法步 ...
- LeetCode(733)——图像渲染(JavaScript)
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newCol ...
最新文章
- php自动分配,PHP上传文件时自动分配路径的方法_php技巧
- 面试---如何在List<Integer>中如何存放String类型的数据?
- java子类有参构造函数吗_为什么我需要在这个Java通用子类中有一个构造函数?...
- 一些经典的常用ASP代码[经典简单] (2)
- uboot中添加新型号步骤以及编译方法
- 【Trie】最大异或对(ybtoj Trie-2)
- 宝元系统u盘使用说明_教你如何使用U盘安装电脑系统
- 如何赋值hook定义的变量
- 【例题+习题】【数值计算方法复习】【湘潭大学】(一)
- 关于 android 的 view.getLeft(), getRight(), getTop(), getBottom() 的一些疑惑(坑)解答
- 文件上传—DiskFileItemFactory核心类
- alpha-beta剪枝算法原理(附代码)
- 海思Hi3798MV310机顶盒芯片Datasheet-基本信息
- 六轴传感器——姿态检测(20200112)(未完)
- 外贸常用术语_外贸跟单常用术语
- 没比这更简单的了!安装PHP composer(windows环境)及简易使用
- 记录nodejs使用express搭建一个api服务器程序(5)-nodejs操作SQL数据库,Sequelize和Knex
- 色色教你玩魔方(傻瓜式全程图解教学)
- #数据库--第1章 Windows 下的数据库导入 TPCH 数据(以 SQL Server 作为示例,MySQL同样适用)
- CC1121和CC1101的区别
热门文章
- 论文阅读笔记:HRNet
- geany怎么配python_教程详情|Geany配置python教程解析_234游戏网
- jquery淘宝详情页选择套餐实现
- 局域网服务器的文件夹创建快捷方式,教你Win10创建共享文件夹快捷方式的方法...
- Qt 的TCP网络通信
- HTML5表格的设置
- 计算机检索高考投档线,高考查询录取
- 笔记本电脑扬声器喇叭有杂音 解决办法
- java-jdk各版本特性
- 【刷题】数据库SQL实战 [SQL02] - 查找入职员工时间排名倒数第三的员工所有信息