LeetCode刷题NO.419——甲板上的战舰

本文介绍了一种在矩阵中计算战舰数量的算法。通过在矩阵的边界添加额外的元素来简化边界条件处理,该算法能有效地遍历矩阵并判断战舰的位置。适用于LeetCode战舰计数问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/battleships-in-a-board

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

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

【示例】
示例 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’

【解题思路】
board的最后一行和最后一列之后添加一行和一列,值为'.',以防止遍历时越界;定义变量num,用于累计战舰数量。

逐行遍历每个单元格,对于单元格board[i][j],如果该单元格的值为'X'且其右方和下方的单元格的值为'.',即board[i][j]=='X' and board[i+1][j] == board[i][j+1] == '.',说明该单元格是有效战舰,故战舰数量加一,即num=num+1,否则继续遍历。

最终的num即为战舰的数量。
注:

  1. 遍历是从上到下从左到右,当遍历到单元格board[i][j]时,其上方和左方的单元格已经被遍历过了,所以只需比较下方和右方的单元格即可;
  2. 如果board[i][j]=='X',而board[i+1][j] or board[i][j+1] != '.',说明其相邻单元格还有'X',即该单元格并不是战舰的最后一个'X',故不能作为有效战舰;反之,如果board[i][j]=='X',且board[i+1][j] or board[i][j+1] == '.',说明这是一艘战舰的最后一个值为'X'的单元格,故可以作为有效战舰。

【提交代码】

class Solution:
    def countBattleships(self, board: List[List[str]]) -> int:
        row_n = len(board[0])
        col_n = len(board)
        
        for i in range(col_n):
            board[i].append('.')
        board.append(['.']*(row_n+2))
        
        num = 0
        for i in range(col_n+1):
            for j in range(row_n+1):
                if board[i][j]=='X' and board[i+1][j] == board[i][j+1] == '.':
                        num += 1
        
        return num

【运行结果】
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值