419. 甲板上的战舰

题目

给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 ‘X’ 或者是一个空位 ‘.’ ,返回在甲板 board 上放置的战舰的数量。

战舰只能水平或者垂直放置在 board 上。换句话说,战舰只能按 1 x k(1 行,k 列)或 k x 1(k 行,1 列)的形状建造,其中 k 可以是任意大小。两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的战舰)。

示例 1:
示例1附图

  • 输入:board = [["X",".",".","X"],[".",".",".","X"],[".",".",".","X"]]
  • 输出:2

示例 2:

  • 输入:board = [["."]]
  • 输出:0

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j] 是 ‘.’ 或 ‘X’

进阶:你可以实现一次扫描算法,并只使用 O(1) 额外空间,并且不修改 board 的值来解决这个问题吗?

代码

完整代码

void findX(char** board, int boardSize, int* boardColSize, int i, int j)
{
    while((i + 1 < boardSize) && board[i + 1][j] == 'X') // 竖着
    {
        board[i + 1][j] = '.';
        i++;
    }
    while ((j + 1 < (*boardColSize)) && board[i][j + 1] == 'X') // 横着
    {
        board[i][j + 1] = '.';
        j++;
    }
}

int countBattleships(char** board, int boardSize, int* boardColSize){
    int Xcnt = 0;
    for (int i = 0; i < boardSize; i++)
    {
        for (int j = 0; j < (*boardColSize); j++)
        {
            if(board[i][j] == 'X')
            {
                Xcnt++;
                findX(board, boardSize, boardColSize, i, j);
            }
        }
    }
    return Xcnt;
}

思路分析

题目的要求是计算出矩阵 board 中放置的战舰数量。战舰只能水平或者垂直放置且彼此之间没有相邻。我们的目标是遍历整个矩阵,找到所有的战舰并进行计数。

拆解分析

  1. 遍历矩阵:使用两层嵌套的 for 循环遍历整个 board
  2. 找到战舰:当找到一个战舰(即 ‘X’),增加战舰计数。
  3. 清理战舰:为了防止重复计数,调用 findX 函数将已经计数的战舰用 ‘.’ 替换(通过横向和纵向搜索替换)。
  4. 返回结果:遍历完成后,返回计数的战舰数量。

复杂度分析

  • 时间复杂度O(m * n),其中 m 是矩阵的行数,n 是矩阵的列数。我们需要遍历每个单元格来查找战舰。
  • 空间复杂度O(1),没有使用额外的空间,只在原矩阵上进行操作。

结果

结果

一题多解

一次扫描法(Single Pass Approach)

一次扫描法思路分析

我们可以通过一次扫描矩阵,并使用额外的条件检查来避免修改矩阵值。在扫描时,仅在战舰的起始位置(即左上角)进行计数。此解法符合进阶条件。

具体步骤:

  1. 仅在当前位置的上方和左方均为空位(或者越界)时计数战舰。
  2. 继续扫描直到完成整个矩阵。

一次扫描法复杂度分析

  • 时间复杂度O(m * n),需要遍历每个单元格。
  • 空间复杂度O(1),只使用常量空间。

下面是具体的实现代码:

完整代码

int countBattleshipsSinglePass(char** board, int boardSize, int* boardColSize) {
    int Xcnt = 0;
    for (int i = 0; i < boardSize; i++) {
        for (int j = 0; j < (*boardColSize); j++) {
            if (board[i][j] == 'X' &&
                (i == 0 || board[i - 1][j] == '.') &&
                (j == 0 || board[i][j - 1] == '.')) {
                Xcnt++;
            }
        }
    }
    return Xcnt;
}

复杂度分析

  • 时间复杂度O(m * n),因为需要遍历每个单元格。
  • 空间复杂度O(1),只使用常量空间。

结果在这里插入图片描述

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

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

相关文章

弘君资本:光刻机、存储芯片概念拉升 同益股份、上海贝岭等涨停

光刻机概念11日盘中再度走强&#xff0c;到发稿&#xff0c;双乐股份、同益股份、东方嘉盛、盛剑环境等涨停&#xff0c;飞凯资料涨近10%&#xff0c;南大光电涨超7%。 存储芯片概念亦拉升&#xff0c;到发稿&#xff0c;雅创电子涨超12%&#xff0c;万润科技、上海贝岭、好上…

何为屎山代码?

在编程界&#xff0c;有一种代码被称为"屎山代码"。这并非指某种编程语言或方法&#xff0c;而是对那些庞大而复杂的项目的一种形象称呼。屎山代码&#xff0c;也被称为"祖传代码"&#xff0c;是历史遗留问题&#xff0c;是前人留给我们的"宝藏"…

FL Studio21.2.8最新永久破解安装包下载,音乐创作神器免费下载

大家好&#xff01;今天我要和大家分享一个超棒的音乐制作软件——FL Studio21永久免费破解中文版下载&#xff01;&#x1f929; 作为一名音乐爱好者&#xff0c;我一直在寻找一款功能强大、操作简单的音乐制作工具。而FL Studio21正是我梦寐以求的宝藏&#xff01;&#x1f3…

2024年6月8日,骑行杨柳冲峡谷:一场心灵与自然的交响曲

引言&#xff1a;寻找生活的节奏在这个快节奏的时代&#xff0c;我们常常迷失在都市的喧嚣中&#xff0c;忘记了如何聆听内心的声音。2024年6月8日&#xff0c;我与一群志同道合的校卡骑行群骑友&#xff0c;踏上了前往杨柳冲峡谷的旅程&#xff0c;这不仅仅是一次简单的户外活…

【牛客面试必刷TOP101】Day31.BM60 括号生成和BM61 矩阵最长递增路径

文章目录 前言一、BM60 括号生成题目描述题目解析二、BM61 矩阵最长递增路径题目描述题目解析总结 前言 一、BM60 括号生成 题目描述 描述&#xff1a; 给出n对括号&#xff0c;请编写一个函数来生成所有的由n对括号组成的合法组合。 例如&#xff0c;给出n3&#xff0c;解集为…

如何优化仓库布局与ERP库存管理

一、引言 随着企业规模的不断扩大&#xff0c;仓库管理和库存控制成为企业运营中不可或缺的一环。优化仓库布局和提高ERP库存管理效率&#xff0c;对于降低企业成本、提高物流效率、增强企业竞争力具有重要意义。 二、优化仓库布局 1. 分析仓库需求 在优化仓库布局之前&…

如何使用Python在word文档中创建表格

如何使用Python在word文档中创建表格 介绍效果代码 介绍 本文将介绍如何使用Python库python-docx在Word文档中创建表格。 效果 插入表格前的word文档&#xff1a; 插入表格后的word文档&#xff1a; 代码 from docx import Document# 加载现有的Word文档 doc Document(…

计算机专业:未来何去何从?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Docker高级篇之Docker-compose容器编排

文章目录 1. Docker-compse介绍2. Docker-compse下载3. Docker-compse核心概念4. Docker-compse使用案例 1. Docker-compse介绍 Docker-compose时Docker官方的一个开源的项目&#xff0c;负责对Docker容器集群的快速编排。Docker-compose可以管理多个Docker容器组成一个应用&a…

C++第二十六弹---stack和queue的基本操作详解与模拟实现

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1. stack的介绍和使用 1.1 stack的介绍 ​1.2 stack的使用 1.3 stack 模拟实现 2. queue的介绍和使用 2.1 queue的介绍 2.2 queue的使用 2…

Transformer介绍

Transformer的诞生 2018年Google发出一篇论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》, BERT模型横空出世, 并横扫NLP领域11项任务的最佳成绩&#xff01; 而在BERT中发挥重要作用的结构就是Transformer, 之后又相继出现XLNET&a…

java:使用shardingSphere访问mysql的分库分表数据

# 创建分库与分表 创建两个数据库【order_db_1、order_db_2】。 然后在两个数据库下分别创建三个表【orders_1、orders_2、orders_3】。 建表sql请参考&#xff1a; CREATE TABLE orders_1 (id bigint NOT NULL,order_type varchar(255) NULL DEFAULT NULL,customer_id bigi…

快速学习Java的多维数组技巧

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

Unity3D测量面积和角度实现方法(二)

系列文章目录 unity工具 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、unity测量面积&#x1f449;1-1 视频效果&#x1f449;1-2 先创建预制体&#x1f449;1-3 在创建LineRenderer预制体&#x1f449;1-4 代码如下 &#x1f449;二、测量平面和测量空间切换&…

java---程序逻辑控制(详解)

目录 一、概述二、顺序结构三、分支结构3.1 if语句3.1.1 语法格式13.1.2 语法格式23.1.3 语法格式3 3.2 练习3.2.1 判断一个数字是奇数还是偶数3.2.2 判断一个数字是正数&#xff0c;负数&#xff0c;还是零3.2.3 判断一个年份是否为闰年 3.3.switch语句 四、循环结构4.1 while…

远程工作岗位机会

电鸭&#xff1a;​​​​​​https://eleduck.com/?sortnew电鸭社区是具有8年历史的远程工作招聘社区&#xff0c;也是远程办公互联网工作者们的聚集地。在社区&#xff0c;我们进行有价值的话题讨论&#xff0c;也分享远程、外包、零活、兼职、驻场等非主流工作机会。「只工…

最好用的搜题软件大学?8个公众号和软件推荐清单! #知识分享#知识分享#经验分享

今天&#xff0c;我将分享一些受欢迎的、被大学生广泛使用的日常学习工具&#xff0c;希望能给你的学习生活带来一些便利和启发。 1.彩虹搜题 这个是公众号 一款专供大学生使用的搜题神器专注于大学生校内学习和考研/公考等能力提升 下方附上一些测试的试题及答案 1、行大量…

【C++】B树

概念 实现 二叉搜索树的插入&#xff08;非递归&#xff09; 二叉搜索树的中序遍历 二叉搜索树的查找&#xff08;非递归&#xff09; 二叉搜索树的删除&#xff08;非递归&#xff09; 二叉搜索树的查找&#xff08;递归&#xff09; 拷贝构造函数 赋值运算符重载 三、…

三星系统因何而成?或许是因为吞噬了第四颗恒星

相比于其他的类似星体&#xff0c;这个特殊的三星系统拥有更大更紧密的星体。 三星 天文学家发现了前所未见的三星系统。相比于其他典型的三星系统&#xff0c;这一三星系统拥有更大的体积&#xff0c;并且排列也更加紧密&#xff0c;这也使得这一系统更加特别。科学家推测&am…

好用的Web数据库管理工具推荐(ChatGPT 4o的推荐是什么样?)

在现代数据管理和开发中&#xff0c;Web数据库管理工具变得越来越重要。这些工具不仅提供了直观的用户界面&#xff0c;还支持跨平台操作&#xff0c;方便用户在任何地方进行数据库管理。 目录 1. SQLynx 2. phpMyAdmin 3. Adminer 4. DBeaver 5 结论 以下是几款推荐的Web…