【数组】力扣419:甲板上的战舰
给你一个大小为 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
进阶:你可以实现一次扫描算法,并只使用 O(1) 额外空间,并且不修改 board 的值来解决这个问题吗?
方法1:枚举起点
解题思路:
对每条战舰的第一个格子计数。
实现:
由于战舰的形状只有"一"或"|",所以每条战舰的第一个格子一定是最左边的格子或最上方的格子。
一次扫描board。假设当前扫描到board[i][j],若要此格子是某战舰的第一个格子,需要满足三个条件:
1、board[i][j] == "X"
2、board[i][j-1] != "X",即本格子左边的格子不是"X"
3、board[i-1][j] != "X",即本格子上方的格子不是"X"
(当然,要确认下标)
class Solution:
def countBattleships(self, board: List[List[str]]) -> int:
m = len(board)
n = len(board[0])
ans = 0
for i in range(m):
for j in range(n):
if board[i][j] == ".":
continue
if 0 < i and board[i-1][j] == "X":
continue
if 0 < j and board[i][j-1] == "X":
continue
ans += 1
return ans
作者:mumuxin-i
链接:https://leetcode-cn.com/problems/battleships-in-a-board/solution/python3yong-shi-ji-bai-100shou-xian-yao-ohpqt/
时间复杂度:O(m×n),其中 m 是矩阵的行数,n 是矩阵的列数,我们只需要遍历一遍矩阵中每个位置即可
空间复杂度:O(1)
方法2:技巧解法(没看懂)
首先,在甲板的最后添加一行"."和一列"."
再将判定条件设置为:当"X"的尾部(右和下)均为"."时,count加1。
该方法通过添加的"."行和列解决"X"位于边界难以判断的问题。
class Solution:
def countBattleships(self, board: List[List[str]]) -> int:
count=0
row = len(board)
col = len(board[0])
board.append(['.' for k in range(col)])
for k in board:
k.append('.')
for i in range(row):
for j in range(col):
if board[i][j]=='X' and board[i+1][j]=='.' and board[i][j+1]=='.':
count += 1
return count
作者:pa-hui-er
链接:https://leetcode-cn.com/problems/battleships-in-a-board/solution/ji-bai-98xiao-ji-qiao-ti-gao-shi-jian-xi-gjrh/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理