IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode:733. 图像渲染(java版) -> 正文阅读

[数据结构与算法]LeetCode:733. 图像渲染(java版)

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

题目意思其实很简单,就是给你一个初始坐标点(sr,sc),找和该点附近像素值相同的坐标,而这附近的定义就是上下左右,不包括斜对角;然后将这些像素值替换为新的像素值newColor。

虽然题目是easy,但是对我而言不是easy???????(so sad...

话不多说,直接看解题方法吧!

方法1:广度优先搜索BFS(Broad First Search)

我们从给定的起点开始,进行广度优先搜索。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格加入队列,并将该方格的颜色更新,以防止重复入队。

注意:因为初始位置的颜色会被修改,所以我们需要保存初始位置的颜色,以便于之后的更新操作。

class Solution {
    public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
        // 题意:油漆桶工具
        // 1. 广度优先搜索——queue
        int[] dx={0,1,0,-1};
        int[] dy={1,0,-1,0};    // 两个数组结合起来看就是右,下,左,上
        int m=image.length; // row number
        int n=image[0].length;  // column numer
        Queue<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. 假深度优先搜索——stack
        int[] dx={0,1,0,-1};
        int[] dy={1,0,-1,0};    // 两个数组结合起来看就是右,下,左,上
        int m=image.length; // row number
        int n=image[0].length;  // column numer
        Deque<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)

我们从给定的起点开始,进行深度优先搜索。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格的颜色更新,以防止重复搜索;如果不相同,则进行回溯。

注意:因为初始位置的颜色会被修改,所以我们需要保存初始位置的颜色,以便于之后的更新操作。

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 number
        int n=image[0].length;  // column number
        if(!(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);
            }
        }
    }
}

参考:

力扣

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:39:00  更:2022-05-11 16:39:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:49:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码