岛屿问题刷题

news2024/11/19 7:28:47

200. 岛屿数量 - 力扣(LeetCode)

class Solution {
    public int numIslands(char[][] grid) {
        int n = grid.length;//grid行数
        int m = grid[0].length;//grid列数
        int res = 0;
        for(int r = 0;r<n;r++){
            for(int c=0;c<m;c++){
                if(grid[r][c]=='1'){
                    dfs(grid,r,c);
                    res++;
                }
            }
        }
        return res;    
    }

    public void dfs(char[][] grid,int r,int c){
        if(!inArea(grid,r,c)){
            return;
        }
        if(grid[r][c]!='1'){
            return;
        }
        grid[r][c] = '2';

        dfs(grid,r+1,c);
        dfs(grid,r-1,c);
        dfs(grid,r,c+1);
        dfs(grid,r,c-1);
    }

    public boolean inArea(char[][] grid,int r,int c){
        return r>=0&&r<grid.length&&c>=0&&c<grid[0].length;
    }

}

463. 岛屿的周长 - 力扣(LeetCode)

class Solution {
    public int islandPerimeter(int[][] grid) {
        for(int r = 0;r<grid.length;r++){
            for(int c = 0;c<grid[0].length;c++){
                if(grid[r][c] == 1){
                    //题目说只有一个
                    return dfs(grid,r,c);
                }
            }
        }
        return 0;
    }

    int dfs(int[][] grid,int r,int c){
        //函数因为坐标(r,c)超出网格范围,返回对应一条黄色的边
        if(!inArea(grid,r,c)){
            return 1;
        }
        //函数因为[当前格子是海洋格子]返回,对应一条蓝色的边
        if(grid[r][c]==0){
            return 1;
        }
        //函数因为[当前格子已经是遍历的陆地格子]返回,跟周长没有关系
        if(grid[r][c]!=1){
            return 0;
        }
        grid[r][c] = 2;
        return dfs(grid,r-1,c)+dfs(grid,r+1,c)
        +dfs(grid,r,c-1)+dfs(grid,r,c+1);
    }
    //判断[r,c]是否在网络中
    boolean inArea(int[][] grid,int r,int c){
        return 0<=r&&r<grid.length&&0<=c&&c<grid[0].length;
    }
}

695. 岛屿的最大面积 - 力扣(LeetCode)

class Solution {
    public int[] dx = {0,0,1,-1};
    public int[] dy = {1,-1,0,0};
    public int row,col;
    public boolean[][] check = new boolean[50][50];
    public int count = 0;
    public int ret = 0;
    public int maxAreaOfIsland(int[][] grid) {
       row = grid.length;
       col = grid[0].length;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(!check[i][j] && grid[i][j] ==1){
                    count=0;//重置count
                    dfs(grid,i,j);
                    ret = Integer.max(ret,count);
                }
            }
        }
        return ret;
    }
    private void dfs(int[][] grid,int i,int j){
        count++;
        check[i][j] = true;
        for(int k=0;k<4;k++){
            int x = i+dx[k],y = j+dy[k];
            if(x>=0&&x<row&&y>=0&&y<col&&!check[x][y]&&grid[x][y]==1){
                dfs(grid,x,y);
            }
        }

    }
}

827. 最大人工岛 - 力扣(LeetCode)

class Solution {
    public int largestIsland(int[][] grid) {
        // dfs+哈希表

        //算法: 对所有岛屿编号,再遍历所有0,枚举所有能相连的岛屿的面积和最大值
        int n = grid.length;
        int maxArea = 0,islandIdx = 2;

        //1.对所有岛屿编号并记录在哈希表中
        Map<Integer,Integer>map = new HashMap<>();// key-岛屿编号 value-岛屿面积
        for(int i = 0;i<n;i++){
            for(int j = 0;j<n;j++){
                if(grid[i][j] == 1){
                    int area = dfs(grid,i,j,islandIdx);
                    map.put(islandIdx,area);
                    islandIdx++;
                    maxArea = Math.max(area,maxArea);
                }
            }
        }
        //2.枚举所有0的上下左右可能连接的情况
        for(int i = 0;i<n;i++){
            for(int j = 0;j<n;j++){
                Set<Integer>set = new HashSet<>();//记录/区分当前0周围的不同岛屿
                if(grid[i][j] == 0){
                    //如果相邻的格子,没越界,且是岛屿,则把[岛屿编号]加入set
                    if(i-1>=0&&grid[i-1][j] >= 2){
                        set.add(grid[i-1][j]);//上
                    }
                    if(i+1<n&&grid[i+1][j]>=2){
                        set.add(grid[i+1][j]);//下
                    }
                    if(j-1>=0&&grid[i][j-1]>=2){
                        set.add(grid[i][j-1]);//左
                    }
                    if(j+1<n&&grid[i][j+1]>=2){
                        set.add(grid[i][j+1]);//右
                    }

                    //初始化当前连接后的最大面积和
                    int curMaxArea = 1;//
                    for(int idx:set){
                        int otherArea = map.get(idx);
                        curMaxArea+=otherArea;
                    }
                    maxArea = Math.max(maxArea,curMaxArea);
                }
            }
        }
        return maxArea;
    }

    int dfs(int[][] grid,int x,int y,int islandIdx){
        //递归终止条件
        if(x<0||x>=grid.length||y<0||y>=grid[0].length||grid[x][y]!=1){
            return 0;
        }
        //标记已访问
        grid[x][y] = islandIdx;
        return 1+dfs(grid,x+1,y,islandIdx)
        +dfs(grid,x-1,y,islandIdx)
        +dfs(grid,x,y+1,islandIdx)
        +dfs(grid,x,y-1,islandIdx);
    }
}

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

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

相关文章

HCIP-VLAN综合实验

一、实验拓扑 二、实验要求 1、pc1和pc3所在接口为access;属于vlan 2; PC2/PC4/PC5/PC6处于同一网段’其中PC2可以访问PC4/PC5/PC6; PC4可以访问PC6&#xff1b;PC5不能访问PC6&#xff1b; 2、PC1/PC3与PC2/PC4/PC5/PC6不在同一个网段&#xff1b; 3、所有PC通过DHCP获取IP…

Multi-Attention Transformer for Naturalistic Driving Action Recognition

标题&#xff1a;用于自然驾驶行为识别的多注意力Transformer 源文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2023W/AICity/papers/Dong_Multi-Attention_Transformer_for_Naturalistic_Driving_Action_Recognition_CVPRW_2023_paper.pdfhttps://openaccess…

安装ollama并部署大模型并测试

Ollama介绍 项目地址&#xff1a;ollama 官网地址&#xff1a; https://ollama.com 模型仓库&#xff1a;https://ollama.com/library API接口&#xff1a;api接口 Ollama 是一个基于 Go 语言开发的简单易用的本地大语言模型运行框架。可以将其类比为 docker&#xff08;同基…

鸿蒙ArkUI-X跨平台技术:【SDK结构介绍】

ArkUI-X SDK目录结构介绍 简介 本文档配套ArkUI-X&#xff0c;将OpenHarmony ArkUI开发框架扩展到不同的OS平台&#xff0c;比如Android和iOS平台&#xff0c;让开发者基于ArkUI&#xff0c;可复用大部分的应用代码&#xff08;UI以及主要应用逻辑&#xff09;并可以部署到相…

深度学习之人脸性别年龄检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着计算机视觉和深度学习技术的飞速发展&#xff0c;人脸性别年龄检测系统在多个领域展现出广…

简易Docker磁盘使用面板Doku

这个项目似乎有 1 年多没更新了&#xff0c;最后发布版本的问题也没人修复&#xff0c;所以看看就行&#xff0c;不建议安装 什么是 Doku &#xff1f; Doku 是一个简单、轻量级的基于 Web 的应用程序&#xff0c;允许您以用户友好的方式监控 Docker 磁盘使用情况。Doku 显示 D…

【30天精通Prometheus:一站式监控实战指南】第6天:mysqld_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

JavaEE-网络初识

文章目录 一、网络背景1.1 起源1.2 国内网络的发展 二、关键概念2.1 网络2.2 设备2.3 ip地址与端口号 三、协议3.1 协议分层3.2 OSI七层模型3.3 TCP/IP五层模型3.4 数据传输过程的简单叙述 一、网络背景 1.1 起源 在国外大概时上世纪70年代左右&#xff0c;网络就出现了&…

鸿蒙OS开发:【一次开发,多端部署】(典型布局场景)

典型布局场景 虽然不同应用的页面千变万化&#xff0c;但对其进行拆分和分析&#xff0c;页面中的很多布局场景是相似的。本小节将介绍如何借助自适应布局、响应式布局以及常见的容器类组件&#xff0c;实现应用中的典型布局场景。 布局场景实现方案 开发前请熟悉鸿蒙开发指导…

与MySQL DDL 对比分析OceanBase DDL的实现

本文将简要介绍OceanBase的DDL实现方式&#xff0c;并通过与MySQL DDL实现的对比&#xff0c;帮助大家更加容易理解。 MySQL DDL 的算法 MySQL 的DDL实现算法主要有 copy、inplace和instant。 copy copy算法的实现相对简单&#xff0c;MySQL首先会创建一个临时表&#xff0…

服务器c盘爆满了,这几种方法可以帮助C盘“瘦身”

我们在使用服务器的时候基本不会在C盘安装软件&#xff0c;那么用久了发现C盘满了&#xff0c;提示空间不足&#xff1f;那么这是怎么回事&#xff0c;为什么空间会占用这么快呢&#xff1f; 原因一&#xff1a; C盘满了&#xff0c;很可能是因为电脑里的垃圾文件过多。操作系…

Servlet的request对象

request对象的继承关系 1.HttpServletRequest接口继承了ServletRequest接口&#xff0c;对其父接口进行了扩展&#xff0c;可以处理满足所有http协议的请求 2.HttpServletRequest和ServletRequest都是接口&#xff0c;不能创建对象&#xff0c;因此在tomcat底层定义实现类并创…

Google Find My Device:科技守护,安心无忧

在数字化的时代&#xff0c;我们的生活与各种智能设备紧密相连。而 Google Find My Device 便是一款为我们提供安心保障的实用工具。 一、Find My Decice Netword的定义 谷歌的Find My Device Netword旨在通过利用Android设备的众包网络的力量&#xff0c;帮助用户安全的定位所…

考场作弊行为自动抓拍分析系统

考场作弊行为自动抓拍分析系统采用了AI神经网络和深度学习算法&#xff0c;考场作弊行为自动抓拍分析系统通过人形检测和骨架勾勒等技术&#xff0c;实时计算判断考生的异常动作行为。通过肢体动作识别技术&#xff0c;系统可以详细分析考生的头部和手部肢体动作&#xff0c;进…

【oracle004】oracle内置函数手册总结(已更新)

1.熟悉、梳理、总结下oracle相关知识体系。 2.日常研发过程中使用较少&#xff0c;随着时间的推移&#xff0c;很快就忘得一干二净&#xff0c;所以梳理总结下&#xff0c;以备日常使用参考 3.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 总结源文件资源下载地址&#x…

Google发布的CAT3D,在1分钟内,能够从任意数量的真实或生成的图像创建3D场景。

给定任意数量的输入图像&#xff0c;使用以这些图像为条件的多视图扩散模型来生成场景的新视图。生成的视图被输入到强大的 3D 重建管道&#xff0c;生成可以交互渲染的 3D 表示。总处理时间&#xff08;包括视图生成和 3D 重建&#xff09;仅需一分钟。 相关链接 论文&#x…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 18 节&#xff09; P18《17.ArkUI-状态管理Observed 和 ObjectLink》 第一件事&#xff1a;嵌套对象的类型上加上 Observed 装饰器…

晶体振荡器

一、晶振与晶体区别 晶振是有源晶振的简称&#xff0c;又叫振荡器&#xff0c;英文名称是oscillator&#xff0c;内部有时钟电路&#xff0c;只需供电便可产生振荡信号&#xff1b;晶体是无源晶振的简称&#xff0c;也叫谐振器&#xff0c;英文名称是crystal&#xff0c;是无极…

C++第三方库【JSON】— jsoncpp

目录 认识JSON jsoncpp库 安装&使用 认识jsoncpp Json::Value jsoncpp序列化 jsoncpp反序列化 认识JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据&#xff0c;常用于在客户端和服…

深度学习:手撕 RNN(1)-RNN 的直观认识

本文首次发表于知乎&#xff0c;欢迎关注作者。 1. RNN是什么 RNN&#xff08;Recurrent Neural Network&#xff09;存在很多变体&#xff0c;为了方便叙述和理解&#xff0c;本文选取一个基本的 RNN 结构进行说明&#xff0c;该结构与 pytorch 中的 RNN 函数&#xff08;[1]…