题外话:看完题目,是不是一头雾水。有疑问就对了,不知道出题者的语文老师看了有啥感想。

题目意思其实很简单,就是给你一个初始坐标点(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是方知有相关推荐

  1. LeetCode 733. 图像渲染(DFS/BFS)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 1. 题目 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr ...

  2. 733.图像渲染(主讲题意)

    有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newCol ...

  3. 695. 岛屿的最大面积(适合 初学者 理解的java版BFS)

    文章目录 BFS 给你一个大小为 m x n 的二进制矩阵 grid . 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻.你可以 ...

  4. leetcode -43 -字符串相乘 -java版

    文章目录 题目 代码 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = &quo ...

  5. 文巾解题 733. 图像渲染

    1 题目描述 2 解题思路 注意一点,如果第一个要渲染的点,颜色和要渲染成的颜色是一样的,那么我们直接返回.不然的话会死循环. 2.1 广度优先遍历 广搜是使用队列来实现的 class Solutio ...

  6. leetcode 461. 汉明距离(Java版)

    题目 https://leetcode-cn.com/problems/hamming-distance/ 题解 使用 Java 中的按位异或 ^ 运算符:https://www.baeldung.c ...

  7. java创建对象new后面为啥可以传入参数_你有认真了解过自己的“Java对象”吗?渣男...

    对象在 JVM 中是怎么存储的 对象头里有什么? 作为一名 Javaer,生活中的我们可能暂时没有对象,但是工作中每天都会创建大量的 Java 对象,你有试着去了解下自己的"对象" ...

  8. 目标检测Part2+Leetcode(733)

    目标检测Part2 目标检测Part2(R-FCN,Yolo) 1.R-FCN 1.1 检测网络的变换敏感性 和 分类网络的变换不变性 1.2 设计动机(模型优势) 1.3 R-FCN架构分析-算法步 ...

  9. LeetCode(733)——图像渲染(JavaScript)

    有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newCol ...

最新文章

  1. php自动分配,PHP上传文件时自动分配路径的方法_php技巧
  2. 面试---如何在List<Integer>中如何存放String类型的数据?
  3. java子类有参构造函数吗_为什么我需要在这个Java通用子类中有一个构造函数?...
  4. 一些经典的常用ASP代码[经典简单] (2)
  5. uboot中添加新型号步骤以及编译方法
  6. 【Trie】最大异或对(ybtoj Trie-2)
  7. 宝元系统u盘使用说明_教你如何使用U盘安装电脑系统
  8. 如何赋值hook定义的变量
  9. 【例题+习题】【数值计算方法复习】【湘潭大学】(一)
  10. 关于 android 的 view.getLeft(), getRight(), getTop(), getBottom() 的一些疑惑(坑)解答
  11. 文件上传—DiskFileItemFactory核心类
  12. alpha-beta剪枝算法原理(附代码)
  13. 海思Hi3798MV310机顶盒芯片Datasheet-基本信息
  14. 六轴传感器——姿态检测(20200112)(未完)
  15. 外贸常用术语_外贸跟单常用术语
  16. 没比这更简单的了!安装PHP composer(windows环境)及简易使用
  17. 记录nodejs使用express搭建一个api服务器程序(5)-nodejs操作SQL数据库,Sequelize和Knex
  18. 色色教你玩魔方(傻瓜式全程图解教学)
  19. #数据库--第1章 Windows 下的数据库导入 TPCH 数据(以 SQL Server 作为示例,MySQL同样适用)
  20. CC1121和CC1101的区别

热门文章

  1. 论文阅读笔记:HRNet
  2. geany怎么配python_教程详情|Geany配置python教程解析_234游戏网
  3. jquery淘宝详情页选择套餐实现
  4. 局域网服务器的文件夹创建快捷方式,教你Win10创建共享文件夹快捷方式的方法...
  5. Qt 的TCP网络通信
  6. HTML5表格的设置
  7. 计算机检索高考投档线,高考查询录取
  8. 笔记本电脑扬声器喇叭有杂音 解决办法
  9. java-jdk各版本特性
  10. 【刷题】数据库SQL实战 [SQL02] - 查找入职员工时间排名倒数第三的员工所有信息