419. 甲板上的战舰

2024-06-11 15:28
文章标签 战舰 419 甲板

本文主要是介绍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),只使用常量空间。

结果在这里插入图片描述

这篇关于419. 甲板上的战舰的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051557

相关文章

海力士A-DIE颗粒内存条震撼发布:毁灭者星际战舰DDR5内存条登场

**海力士A-DIE颗粒内存条震撼发布:毁灭者星际战舰内存条登场** 近日,海力士正式发布了全新一代A-DIE颗粒内存条——毁灭者星际战舰DDR5 7200RGB电竞内存条。这款内存条凭借其卓越的性能和先进的技术,成为数码爱好者关注的焦点。 导语: 海力士在内存领域一直保持着领先地位,此次发布的毁灭者星际战舰内存条,更是其技术创新的结晶。该产品采用了最新的A-DIE颗粒技术,旨在

每日一题39:甲板上的战舰

一、每日一题 题意 这题的标题应该是《棋盘上的战舰》,来源于 海战棋,把横着或竖着的连续 X 看成一艘战舰,统计棋盘上有多少艘战舰。 思路 战舰的个数,等于战舰「头部」的个数。如下图,我们只需要统计蓝色 X 的个数,即为战舰的个数。 具体来说,如果位于 (i,j)(i,j)(i,j) 的格子是战舰的头部,那么左边和上边的相邻格子不能是 X,即: 如果 j>0,那么 (i,j−1)(i,

LeetCode:419. 甲板上的战舰(遍历 Java)

目录 419. 甲板上的战舰 题目描述: 实现代码与解析: 遍历 原理思路: 419. 甲板上的战舰 题目描述:         给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 'X' 或者是一个空位 '.' ,返回在甲板 board 上放置的 战舰 的数量。 战舰 只能水平或者垂直放置在 board 上。换句话说,战舰只能按

419. 甲板上的战舰 Medium

给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 'X' 或者是一个空位 '.' ,返回在甲板 board 上放置的 战舰 的数量。 战舰 只能水平或者垂直放置在 board 上。换句话说,战舰只能按 1 x k(1 行,k 列)或 k x 1(k 行,1 列)的形状建造,其中 k 可以是任意大小。两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的

SQLCODE=-419, SQLSTATE=42911

项目场景: DB2报错:SQLCODE=-419, SQLSTATE=42911 问题描述: 运行程序时,提示SQLCODE=-419, SQLSTATE=42911 select cash_flow / nvl(CASHFLOW_DISCOUNT,1) from 表A 原因分析: 翻阅资料后发现,十进制除法运算无效。 在DB2除法中,被除数A / 除数B,两个字段的字段类型有

419. Battleships in a Board

题目 Given an 2D board, count how many battleships are in it. The battleships are represented with ‘X’s, empty slots are represented with ‘.’s. You may assume the following rules: You receive a valid

【图像去噪】基于matlab全变分算法图像去噪【含Matlab源码 419期】

⛄一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【图像去噪】基于matlab全变分算法图像去噪【含Matlab源码 419期】 (https://download.csdn.net/download/TIQCmatlab/62925370) 点击上面蓝色字体,直接付费下载,即可。 获取代码方式2: 付费专栏Matlab图像处理(初级版) 备注: 点击上面蓝色字体付费专栏Matl

java 控制台 游戏_【Java猫说】构建战舰类控制台游戏

阅读本文约 “7分钟” 我们将用基础Java来模拟实现大家熟悉的战舰游戏,目标是要猜想对方战舰坐标,然后开炮攻击,命中所有战舰后,游戏结束。接下来我们来分析一下具体的实现。 游戏目标:玩家输入坐标,打击随机生成的战舰,全部打掉时游戏通关 初始设置:创建随机战舰数组坐标,这里我们用Int类型的数组来表示,开始等待用户攻击 进行游戏:用户输入一个坐标后,游戏程序判断是否击中,返回提示“miss”、“

Java 面向对象战舰小游戏

Java面向对象战舰小游戏 前言思路:战舰项目代码1. 战舰特征和行为水雷艇特征和行为侦查艇特征和行为鱼雷艇特征和行为水雷特征和行为深水炸弹特征和行为 2. 归纳共有特征3.初始化4. 画图5. 重写方法定时器新建潜水艇对象新建水雷新建深水炸弹重写所有类的move方法 6. 把超过窗口和相互碰撞的物体删掉删除超过窗口的对象删除相互碰撞的物体 7.最终代码BattleshipBombImage

基于MVC框架实现网页战舰游戏

基于MVC框架实现网页战舰游戏 最终的视觉效果: 最终实现的功能: 每个战舰可以垂直或水平的隐藏在三节连续的单元格中; 用户在右下角猜测战舰在哪个单元格,然后点击fire按钮,如果该单元格有战舰,则在该单元格显示hit图案;没有战舰,则显示miss图案。 如果战舰的三节组成全部被击中,则这个战舰就被击沉; 如果用户击中所有战舰,就在左上角输出另一些提示信息。 第一步:搭建网页结构和视觉效果