递归算法学习——图像渲染,岛屿的数量,最大的岛屿

news2025/1/21 2:49:19

目录

​编辑

一,图像渲染

1.题意

2.解释

3.题目接口

4.解题思路及代码

二,岛屿的数量

1.题意

2.解释

3.题目接口

4.解题思路及代码

三,最大的岛屿

1.题意

2.解释

 3.题目接口

4.解题代码即思路


 

一,图像渲染

1.题意

有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。

你也被给予三个整数 sr ,  sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。

为了完成 上色工作 ,从初始像素开始,记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应 四个方向上 像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为 newColor 。

最后返回 经过上色渲染后的图像 

2.解释

这一道题要让我们做的便是从一个指定的位置出发将所有和这个位置相同值的一个位置改为指定的新的值,包括这个指定的节点。

3.题目接口

class Solution {
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
        
    }
};

4.解题思路及代码

这道题的解决方法其实也挺简单的。还是和我们之前写过的题目解题方式是一样的,还是通过深度优先搜索的方式来解决。在这里要注意的一点便是当我们指定的位置的值和要修改的的值相等时便不需要修改了,直接返回便是。如若没有这一步便会让代码陷入死循环。现在来写代码:

lass Solution {
public:
    int m,n;
    int num;
    int dx[4] = {0,0,1,-1},dy[4] = {-1,1,0,0};
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
      if(color == image[sr][sc])//当改的位置的值和新值相同的便直接返回
      {
          return image;
      }


       m = image.size();
       n = image[0].size();
       num = image[sr][sc];
       dfs(image,sr,sc,color);
       return image; 
    }

    void dfs(vector<vector<int>>& image,int i,int j,int newcolor)
    {
        image[i][j] = newcolor;//该符合条件的位置的值

        for(int k = 0;k<4;k++)
        {
            int x = i+dx[k],y = j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&image[x][y]==num)
            {
                dfs(image,x,y,newcolor);
            }
        }
    }
};

代码如上,其实和我们之前写的代码的样子是很像的。就是条件有所改变。

二,岛屿的数量

1.题意

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

2.解释

通过题目其是很容易发现这道题的目的便是让我们找到在一个二维数组中找出由字符‘1’连在一起组成的区域有几个。在统计完个数以后返回便是。

3.题目接口

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        
    }
};

4.解题思路及代码

这道题的解题思路还是要用到深度优先遍历。解题代码还是与之前的前几道题的代码相似,只不过就是条件改变了。看看代码便知道了,代码如下:

class Solution {
public:
    int m,n,num;
    vector<vector<bool>>used;
    int dx[4] = {0,0,1,-1},dy[4] = {1,-1,0,0};

    int numIslands(vector<vector<char>>& grid) {
        m = grid.size();
        n = grid[0].size();
        used = vector<vector<bool>>(m,vector<bool>(n));

        for(int i = 0;i<m;i++)
        {
            for(int j = 0;j<n;j++)
            {
                if(grid[i][j]=='1'&&!used[i][j])//注意是字符不是数字
                {
                  num++;
                  dfs(grid,i,j);
                }
            }
        }

        return num;

    }

    void dfs(vector<vector<char>>&grid,int i,int j)
    {
        for(int k = 0;k<4;k++)
        {
            int x = i+dx[k],y = j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]=='1'&&!used[x][y])
            {
                used[x][y] = true;
                dfs(grid,x,y);
            }
        }
    }
};

怎么样?是不是和之前我们写的代码的样子非常的相似啊?只不过是某些条件的改变于是这段代码的解决方式便改变了。在这里要注意这个二维数组里面放的是字符而不是数字。

三,最大的岛屿

1.题意

给你一个大小为 m x n 的二进制矩阵 grid 。

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。

2.解释

这道题便是要我们在由1连成的多个区域里面找出那个最大的区域。

 3.题目接口

class Solution {
public:
    int maxAreaOfIsland(vector<vector<int>>& grid) {

    }
};

4.解题代码即思路

这道题其实和前面的求岛屿的数量的解题代码是差不多的,我们只要在前面代码的基础上改几处代码便可以了。现在来看看代码:

class Solution {
public:
    int m,n,num,Maxnum;
    vector<vector<bool>>used;
    int dx[4] = {0,0,1,-1},dy[4] = {1,-1,0,0};

    int maxAreaOfIsland(vector<vector<int>>& grid) {
        m = grid.size();
        n = grid[0].size();
        used = vector<vector<bool>>(m,vector<bool>(n));

        for(int i = 0;i<m;i++)
        {
            for(int j = 0;j<n;j++)
            {
                if(grid[i][j]==1&&!used[i][j])//注意是数字
                {
                  num = 1;
                  used[i][j] = true;
                  dfs(grid,i,j);
                }
            }
        }

        return Maxnum;
    }

    void dfs(vector<vector<int>>&grid,int i,int j)
    {
        Maxnum = max(num,Maxnum);//每次都将Maxnum更新为最大的那个数
        for(int k = 0;k<4;k++)
        {
            int x = i+dx[k],y = j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1&&!used[x][y])
            {
                num++;
                used[x][y] = true;
                dfs(grid,x,y);
            }
        }
    }
};


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/991281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL——笔试测试题

解析&#xff1a; 要查询各科目的最大分数&#xff0c;可以使用如下的SQL语句&#xff1a; SELECT coursename, MAX(score) FROM t_stuscore GROUP BY coursename; 这条SQL语句使用了MAX()聚合函数来获取每个科目的最大分数&#xff0c;并使用GROUP BY子句按照科目进行分组…

核货宝:收银系统后台一般是怎样的,有哪些功能

收银系统后台是一个重要的管理工具&#xff0c;它为企业提供了对收银机的全面控制和配置。收银系统后台是一个用于管理和配置收银机的软件界面。它通常由以下几个主要部分组成&#xff1a; 1. 登录和权限管理 收银系统后台需要一个安全的登录系统&#xff0c;以确保只有授权人…

Mojo 语言官网

Mojo面向 AI 开发者的新型编程语言&#xff0c;无缝支持CPU、GPU&#xff0c;兼容Python&#xff0c;跟Python类似的语法&#xff0c;但是比Python快68000倍。目前Mojo仅支持Ubuntu&#xff0c;暂不支持Windows和Mac&#xff0c;可以在Mojo Playground先体验一下。 Mojo 语言…

ostringstream 多线程下性能问题探究

文章目录 背景火焰图ostringstream 的结构引用 背景 在实习过程中&#xff0c;有一个业务场景需要用到 ostringstream&#xff0c;但经过导师提醒&#xff0c;ostringstream 在多线程关系下&#xff0c;竞态消耗较大&#xff0c;但对于当前业务场景&#xff0c;每次操作&#…

【美团3.18校招真题2】

大厂笔试真题网址&#xff1a;https://codefun2000.com/ 塔子哥刷题网站博客&#xff1a;https://blog.codefun2000.com/ 最多修改两个字符&#xff0c;生成字典序最小的回文串 提交网址&#xff1a;https://codefun2000.com/p/P1089 由于字符串经过修改一定为回文串&#x…

[Linux]动静态库

[Linux]动静态库 文章目录 [Linux]动静态库见一见库存在库的原因编写库模拟编写静态库模拟使用静态库模拟编写动态库模拟使用静态库 库的加载原理静态库的加载原理动态库的加载原理 库在可执行程序中的编址策略静态库在可执行程序中的编址策略动态库在可执行程序中的编址策略 见…

本地启动 Falcon-180B

本地启动 Falcon-180B 通过 Gradio 的 load 函数&#xff0c;我们可以在本地加载 HuggingFace 的 Spaces 上面的 demo。 那就运行 Falcon-180B 来试试吧。 创建 falcon_demo.py 文件&#xff0c; cat << EOF > falcon_demo.py import gradio as grdemo gr.load(&q…

小节3:数据类型

Python的数据类型包括&#xff1a;字符串&#xff08;str&#xff09;、整数&#xff08;int&#xff09;、浮点数&#xff08;float&#xff09;、布尔类型&#xff08;bool&#xff09;、空值类型&#xff08;NoneType&#xff09;、列表&#xff08;list&#xff09;、字典&…

Spring Cloud zuul与CloseableHttpClient连接池,TLS证书认证

前言 最近做项目&#xff0c;需要一个代理逻辑&#xff0c;实际上这种代理NGINX最好&#xff0c;但是有些额外功能的开发&#xff0c;NGINX就需要额外能力支持&#xff0c;比如lua脚本&#xff0c;常见的做法有kong&#xff0c;apisix等&#xff0c;据说apisix的性能较强&…

Python 03(循环语句)

Python03&#xff08;循环语句&#xff09; 文章目录 Python03&#xff08;循环语句&#xff09;一、while语句二、while实现猜数字三、while循环的嵌套while循环嵌套实例需求&#xff1a; 四、for循环1、什么 是for循环2、语法3、执行流程4、for循环的基本使用5、range()函数6…

光刻机的原理和技术路线概览

一、简介 集成电路产业被誉为现代“工业粮食”&#xff0c;引领未来科学技术产业革命的发展&#xff0c;带动世界前沿技术创新发展。 集成电路产业是社会发展的先导产业&#xff0c;主要包括半导体材料、装备、芯片制造、封装测试、电路设计等重要环节。 随着工业智能制造和电子…

OpenCV(三十):图像膨胀

1.图像膨胀原理 图像膨胀的原理是将一个结构元素&#xff08;也称为核或模板&#xff09;在图像上滑动&#xff0c;并将其与图像中对应位置的像素进行比较。如果结构元素的所有像素与图像中对应位置的像素都匹配&#xff0c;那么该位置的像素值保持不变。如果结构元素的任何一个…

Telnet

远程登录/管理 目录 1、什么是Telnet 2、Telnet工作原理 3、常见的Telnet使用场景 4、Telnet协议结构 5、Telnet工作流程 6、Telnet常见命令 6.1、[Huawei]user-interface ? 用户界面 6.2、[Huawei]user-interface vty ? 6.3、[Huawei-ui-vty0-4]? 6.4、[Huawei-…

软件测试技术题目大全【含答案】

请看下面 你的测试职业发展是什么?  测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&#x…

buuctf crypto 【[AFCTF2018]Morse】解题记录

1.打开文件 2.摩斯密码解密 3.这个结果验证之后发现不对&#xff0c;猜测是16进制转字符 4.验证发现是对的

直方图均衡化原理

import numpy as np import cv2 hist, bins np.histogram(img, bins256, range(0, 256))# 计算累积分布函数&#xff08;CDF&#xff09; cdf np.cumsum(hist)# 归一化CDF&#xff1a; 归一化CDF以确保其范围在0到255之间 cdf_norm 255 * (cdf - cdf.min()) / (cdf.max()…

提词软件有哪些?了解一下这几个

提词软件有哪些&#xff1f;提词软件可以广泛应用于各种场景。除了在学习和工作中提高效率外&#xff0c;在日常生活中也有很多用处。例如&#xff0c;在进行演讲的时候&#xff0c;如果担心会因为紧张而忘词的话&#xff0c;就可以使用一些提词软件&#xff0c;将演讲词编辑进…

使用P5.js来制作一个快乐的小风车动画

p5.js简介 前一段时间偶然了解到一个觉得很好玩儿的东西p5.js,于是就去了解了一下&#xff0c;发现可以自己设计一些有趣的动画效果&#xff0c;设计出来的动画可以放置到页面当中&#xff0c;而且也是简单易学的。 下面是一段官方的介绍&#xff1a; p5.js是一个以 Processi…

0016Java程序设计-springboot幼儿园管理系统

摘 要目 录系统设计开发环境 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于幼儿园管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了幼儿园管理系统&a…

从JVM角度看继承

从JVM角度看继承 最近重读了周志明老师的《深入理解JAVA虚拟机》一书&#xff0c;看完大有收获&#xff0c;但仍对继承情况下对象内存布局有所疑惑&#xff0c;所以查阅资料&#xff0c;结合本书进行分析 参考文档&#xff1a; 【深入理解JVM】&#xff1a;Java类继承关系中…