LeetCode每日一题 | 419 | 甲板上的战舰 |二维数组遍历

✨今天给大家带来的是LeetCode上的第419题——甲板上的战舰(LeetCode 419. Battleships in a Board✨。这道题目是一个经典的二维数组遍历问题,要求我们在一个棋盘中找到所有的战舰。接下来给大家详细讲解一下解题思路和主要的数据结构哦~🥳

题目描述

我们有一个二维数组,代表一个战舰棋盘。棋盘中的每个元素是 ‘X’ 或 ‘.’。‘X’ 代表战舰的一部分,‘.’ 代表水域。战舰只能水平或垂直放置,且战舰之间至少有一个空位(即不相邻)。我们的目标是统计棋盘中战舰的数量。

解题思路💡

1. 一次扫描

我们只需要一次扫描整个棋盘就能解决这个问题。扫描过程中,遇到战舰的起点时计数。

2. 战舰的起点

战舰的起点定义为左上角的‘X’,即它的左边和上边都不是‘X’。

3. 过滤条件

在扫描的过程中,我们需要判断每个‘X’是否是战舰的起点,如果是,则计数+1。

为什么想到这样做?

这种方法利用了战舰只能水平或垂直放置且不相邻的特性,通过一次遍历就能准确统计出所有战舰的数量:

如果当前的‘X’的上方或左方有‘X’,那么它一定不是战舰的起点,因为它已经是一个战舰的一部分。
只有当‘X’的上方和左方都不是‘X’时,它才是一个新的战舰的起点。

通过这种方法,我们可以在不修改棋盘的前提下,使用 O(1) 的额外空间解决问题,非常高效。

主要数据结构

这道题目主要使用了二维数组进行遍历和判断。通过两个嵌套循环遍历整个数组,再通过条件判断找到战舰的起点。

代码实现📋

以下是Scala语言的实现代码,非常简洁哦~

object Solution {
  def countBattleships(board: Array[Array[Char]]): Int = {
    var count = 0
    for (i <- board.indices; j <- board(i).indices if board(i)(j) == 'X') {
      if ((i == 0 || board(i - 1)(j) != 'X') && (j == 0 || board(i)(j - 1) != 'X')) {
        count += 1
      }
    }
    count
  }
}

代码说明:

  • board.indices:遍历行索引
  • board(i).indices:遍历列索引
  • if board(i)(j) == 'X':过滤条件,只对‘X’进行处理
  • if ((i == 0 || board(i - 1)(j) != 'X') && (j == 0 || board(i)(j - 1) != 'X')):判断是否是战舰的起点

小结🔍

这道题目主要考察了二维数组的遍历和条件判断,通过一次扫描和O(1)的额外空间解决了问题,是一道非常经典的二维数组题目。希望大家能通过这道题目巩固二维数组的相关知识点哦~😊

#LeetCode #每日一题 #算法 #数据结构 #Scala #战舰棋盘


希望这个博客能帮到你哦!如果有任何问题或者建议,欢迎在评论区留言~❤️

相关推荐

  1. 419.甲板战舰

    2024-06-18 23:26:03       30 阅读
  2. 94 . 叉树中序 -- 2024.2.10 LeetCode每日

    2024-06-18 23:26:03       58 阅读
  3. 每日 递归叉树

    2024-06-18 23:26:03       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-18 23:26:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-18 23:26:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-18 23:26:03       82 阅读
  4. Python语言-面向对象

    2024-06-18 23:26:03       91 阅读

热门阅读

  1. NumPy 切片和索引

    2024-06-18 23:26:03       24 阅读
  2. 关于CSS

    关于CSS

    2024-06-18 23:26:03      28 阅读
  3. TOP150-LC121-买卖股票的最佳时机

    2024-06-18 23:26:03       32 阅读
  4. CSS 表单设计指南

    2024-06-18 23:26:03       30 阅读
  5. Samba服务访问异常分析处理

    2024-06-18 23:26:03       23 阅读
  6. 华为OD机试 C++ - 生日礼物

    2024-06-18 23:26:03       27 阅读
  7. Rust 的编译时间过长

    2024-06-18 23:26:03       26 阅读
  8. 软件开发小程序正规公司流程是什么样的?

    2024-06-18 23:26:03       31 阅读
  9. sklearn快速入门教程 ——2.基本数据探索

    2024-06-18 23:26:03       34 阅读
  10. 音频处理2_进阶概念

    2024-06-18 23:26:03       38 阅读
  11. Git分支打包的详细教程

    2024-06-18 23:26:03       26 阅读