算法:岛屿的周长

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、问题描述

二、规律总结

总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、问题描述

给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

输入:
[[0,1,0,0],
 [1,1,1,0],
 [0,1,0,0],
 [1,1,0,0]]
输出: 16

二、规律总结

解题思路:

这个题很典型的有规律,我们看上图,可以看到每个黄色的格子有四个边,周长为4,如果两个格子挨着,那么有一个边是重合的,这个边的长度就消失了,所以如果是两个格子挨着,总周长就是4*2 - 1*2。

4代表:每个格子的周长,是固定值

第一个2代表:黄色格子的数量,是变量

1代表:黄色格子重合的边数,是变量

第二个2代表:消失的数量,是固定值

可以再继续增加格子,规律都不会变,那么我们的重点就变成统计黄色格子的数量,以及黄色格子重合的边数。

如果数组中的元素为1代表黄色格子,那么统计黄色格子的数量,即是统计1的数量

统计黄色格子重合的边数,在做这个事情的时候,我们要选取一个方向,举个例子,第二排的前三个黄色格子,我们在第一个格子的视角来看,右边的格子有一条边跟他重合,在中间格子的视角来看,左右格子都有一条边跟他重合,在第三个格子的视角来看,左边的格子有一条边跟他重合。

那么我们不妨设定一个方向,从左到右,不回头看,依次从第一个格子,第二个格子,第三个格子的视角来看,只有2条边是重合的。

垂直方向的类似。

代码示例:

public void test() {
    int[][] grid = {{0, 1, 0, 0}, {1, 1, 1, 0}, {0, 1, 0, 0}, {1, 1, 0, 1}};
    // 记录岛屿的数量, 即数组中1的数量
    int count = 0;
    // 记录岛屿块之间重合的边数
    int num = 0;
    for (int i = 0; i < grid.length; i++) {
        for (int j = 0; j < grid[i].length; j++) {
            if (grid[i][j] == 1) {
                // 记录岛屿的数量+1
                count++;
                // 横向方向, 下一个节点是1, 则计数器+1
                if (i < grid.length - 1 && grid[i + 1][j] == 1) {
                    num++;
                }
                // 垂直方向, 下一个节点是1, 则计数器+1
                if (j < grid[i].length - 1 && grid[i][j + 1] == 1) {
                    num++;
                }
            }
        }
    }
    // 岛屿的周长 = 岛屿的数量 * 4 - 重合的边数 * 2
    int len = count * 4 - num * 2;
    System.out.println(len);
}

总结

注释已加好,抓紧练习,简单到有手就行!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:如何使用 Elasticsearch 进行排序

虽然你在唱这首歌时可能会想象圣诞老人&#xff0c;但欧洲民间传说&#xff0c;尤其是阿尔卑斯地区的民间传说&#xff0c;有两个传奇人物圣尼古拉斯和坎普斯。 象征着慷慨和善良的圣尼古拉斯&#xff0c;在 12 月 6 日 为乖巧的孩子们带来礼物和欢乐&#xff01; 相比之下&…

【算法挨揍日记】day45——474. 一和零、879. 盈利计划

474. 一和零 474. 一和零 题目描述&#xff1a; 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 解…

鸿蒙开发入门

一、开发准备 1.1 开发环境搭建 鸿蒙开发文档华为账号注册DevEco Studio 下载 二、快速入门 三、ArkUI 3.1 Image 3.2 Text 3.3 TextInput 3.4 Button 3.5 循环控制 3.6 List 3.7 自定义 3.8 状态管理 3.8.1 State 装饰器 3.8.2 Prop、Link 装饰器 // 父组件 State str: …

【每日论文阅读】生成模型篇

联邦多视图合成用于元宇宙 标题: Federated Multi-View Synthesizing for Metaverse 作者: Yiyu Guo; Zhijin Qin; Xiaoming Tao; Geoffrey Ye Li 摘要: 元宇宙有望提供沉浸式娱乐、教育和商务应用。然而&#xff0c;虚拟现实&#xff08;VR&#xff09;在无线网络上的传输是…

【Java】SpringBoot整合xxl-job学习使用详解

文章目录 介绍作用如何使用下载项目中央仓库地址环境调度中心初始化“调度数据库”配置部署“调度中心”部署项目调度中心集群&#xff08;可选&#xff09;其他&#xff1a;Docker 镜像方式搭建调度中心配置部署“执行器项目” 执行器maven依赖执行器配置执行器组件配置执行器…

人工智能_机器学习088_DBSCAN聚类案例_KMeans聚类算法效果展示---人工智能工作笔记0128

然后我们先来看一下上一节的代码首先导包 import numpy as np 导入数学计算包 import matplotlib.pyplot as plt 导入画图包 from sklearn.cluster import KMeans,DBSCAN 导入算法 from sklearn import datasets 导入数据集包 然后我们再去创建数据 X,y = datasets.make_c…

MyBatis学习一:快速入门

前言 公司要求没办法&#xff0c;前端也要了解一下后端知识&#xff0c;这里记录一下自己的学习 学习教程&#xff1a;黑马mybatis教程全套视频教程&#xff0c;2天Mybatis框架从入门到精通 文档&#xff1a; https://mybatis.net.cn/index.html MyBatis 快速入门&#xf…

纠删码ReedSolomon

随着大数据技术的发展&#xff0c;HDFS作为Hadoop的核心模块之一得到了广泛的应用。为了数据的可靠性&#xff0c;HDFS通过多副本机制来保证。在HDFS中的每一份数据都有两个副本&#xff0c;1TB的原始数据需要占用3TB的磁盘空间&#xff0c;存储利用率只有1/3。而且系统中大部分…

初识Linux下进程

&#x1f30e;初识进程 初识进程 简单认识一下进程 如何管理进程 进程属性信息 内核运行队列 查看进程 通过系统调用获取进程标识符       父子进程       查看运行中的进程 总结 前言&#xff1a; 我们在电脑上点开的一个个应用&#xff0c;其实就是一个个进程&am…

【输入npm install express出现的报错】

目录 输入&#xff1a;npm install express&#xff0c;出现如下的报错 分析原因 方法1&#xff1a;用管理员的身份进行安装 方法2&#xff1a;更改文件夹的权限 输入&#xff1a;npm install express&#xff0c;出现如下的报错 分析原因&#xff1a; npm在执行安装过程中…

HTML5和JS实现明媚月色效果

HTML5和JS实现明媚月色效果 先给出效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html> <head><title>明媚月光效果</title><style>body {margin: 0;overflow: hidden;background-color: #000; /* 添加一个深色背景以便看到…

vscode中增加参数的一个方法

1 在settings.json 文件中增加参数 2. 在参数中配置 这里也是ok的

VMware 虚拟机 ubuntu 20.04 硬盘扩容方法

前言 最近由于需要编译 【RK3568】的 Linux SDK&#xff0c;发现 虚拟机默认的 200G 空间不足了&#xff0c;因此想增加这个 200G 空间的限制&#xff0c;通过网络上查找了一些方法&#xff0c;加上自己亲自验证&#xff0c;确认 硬盘扩容 正常&#xff0c;方法也比较的容易&a…

MySQL--安装与配置与向日葵的基本操作使用

一.MySQL介绍 1.1 MySQL简介 MySQL是一个开源的关系型数据库管理系统&#xff0c;最早由瑞典MySQL AB公司开发。这个数据库系统有着高可靠性、高性能和易用性的特点&#xff0c;在互联网上得到了广泛的应用。MySQL支持SQL语言&#xff0c;可以运行在多种操作系统上&#xff0c…

draw流程图工具导入云原生(CNCF)相关控件

目录 1、通过draw导入xml文件&#xff0c;获取云原生相关的空间 2、引用自己的资源链接&#xff1a; 1、通过draw导入xml文件&#xff0c;获取云原生相关的空间 导入资源图库&#xff0c;资源放在下方&#xff0c;大家可以下载&#xff1a; 2、引用自己的资源链接&#xff1a;…

C#中汉字转区位码

目录 一、关于区位码 1.区位码定义 2.算法 二、实例 三、生成效果 四、程序中的知识点 1.byte[] GetBytes(string s) 2.字节数组转short类型 一、关于区位码 1.区位码定义 区位码是一个4位的十进制数&#xff0c;每个区位码都对应着一个唯一的汉字&#xff0c;区位码…

小白综述:深度学习 OCR 图片文字识别

文章目录 1. OCR 算法流程1.1 传统 OCR 方法1.2 深度学习 OCR 方法1.2.1 two-stage方法&#xff1a;文字检测识别1.2.2 端到端方法 2. 文本检测算法3. 文本识别算法3.1 基于分割的单字符识别方法3.2 基于序列标注的文本行识别方法 1. OCR 算法流程 OCR (Optical Character Rec…

opencv期末练习题(3)附带解析

创建黑色画板&#xff0c;并支持两种画图功能 import mathimport cv2 import numpy as np """ 1. 创建一个黑色画板 2. 输入q退出 3. 输入m切换画图模式两种模式&#xff0c;画矩形和画圆形。用户按住鼠标左键到一个位置然后释放就可以画出对应的图像 "&qu…

Blender:从新手到专家的全方位指南

Blender&#xff0c;这款强大的开源3D建模和渲染软件&#xff0c;已经成为了CG行业的标准工具之一。它不仅拥有丰富的教程资源&#xff0c;而且还在不断发展和完善中。尽管Blender的教程主要集中在国外网站和YouTube上&#xff0c;但其全面的功能和易用性使它成为许多人的首选工…