Leetcode 419.甲板上的战舰(Battleships in a Board)

Leetcode 419.甲板上的战舰

1 题目描述(Leetcode题目链接

  给定一个二维的甲板, 请计算其中有多少艘战舰。 战舰用 'X’表示,空位用 '.'表示。 你需要遵守以下规则:

  • 给你一个有效的甲板,仅由战舰或者空位组成。
  • 战舰只能水平或者垂直放置。换句话说,战舰只能由 1xN (1 行, N 列)组成,或者 Nx1 (N 行, 1 列)组成,其中N可以是任意大小。
  • 两艘战舰之间至少有一个水平或垂直的空位分隔 - 即没有相邻的战舰。
X..X
...X
...X

在上面的甲板中有2艘战舰。

...X
XXXX
...X

你不会收到这样的无效甲板 - 因为战舰之间至少会有一个空位将它们分开。
进阶:你可以用一次扫描算法,只使用 O ( 1 ) O(1) O(1)额外空间,并且不修改甲板的值来解决这个问题吗?

2 题解

  遍历到 X X X的时候将 X X X所在的战舰都改变为"."。

class Solution:
    def countBattleships(self, board: List[List[str]]) -> int:
        m, n = len(board), len(board[0])
        di = [(0, -1), (0, 1), (-1, 0), (1, 0)] 
        res = 0
        for i in range(m):
            for j in range(n):
                if board[i][j] == 'X':
                    board[i][j] = '.'
                    res += 1
                    for d in di:
                        x, y = i + d[0], j + d[1]
                        while 0 <= x < m and 0 <= y < n and board[x][y] == 'X':
                            board[x][y] = '.'
                            x, y = x + d[0], y + d[1]
        return res

进阶做法可以通过战舰的左上角来判断个数,因为不论是横着的战舰还是竖着的战舰,它的左上角的上面和左面一定是"."。

class Solution:
    def countBattleships(self, board: List[List[str]]) -> int:
        m, n = len(board), len(board[0])
        res = 0
        for i in range(m):
            for j in range(n):
                if board[i][j] == 'X':
                    if (i == 0 or board[i-1][j] == '.') and (j == 0 or board[i][j-1] == '.'):
                        res += 1
        return res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值