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