2021-12-18每日一题练习

419. 甲板上的战舰

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

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

 

示例 1:

2021-12-18每日一题练习
输入:board = [["X",".",".","X"],[".",".",".","X"],[".",".",".","X"]]
输出:2

示例 2:

输入:board = [["."]]
输出:0

 

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j] 是 '.' 或 'X'

 

进阶:你可以实现一次扫描算法,并只使用 O(1) 额外空间,并且不修改 board 的值来解决这个问题吗?

 1 public class CountBattleships {
 2     public int countBattleships(char[][] board) {
 3         int m=board.length,n=board[0].length;
 4         int count=0;
 5         for (int i = 0; i < m; i++) {
 6             for (int j = 0; j < n; j++) {
 7                 if (board[i][j]=='X'){
 8                     count++;
 9                     board[i][j]='.';
10                     dfs(board,i,j);
11                 }
12             }
13         }
14         return count;
15     }
16     void dfs(char[][] a,int x,int y){
17         int m=a.length,n=a[0].length;
18         int tx=x+1,ty=y+1;
19         while(tx<m&&a[tx][y]=='X'){
20             a[tx][y]='.';
21             tx++;
22         }
23         while(ty<n&&a[x][ty]=='X'){
24             a[x][ty]='.';
25             ty++;
26         }
27     }
28 
29     public static void main(String[] args) {
30         char[][] a={{'X','X','X'}};
31         System.out.println(new CountBattleships().countBattleships(a));
32     }
33 }

扫描一遍,扫描到战舰利用深度搜索替换所有该战舰的位置。

上一篇:centos7 keepalived+高可用服务搭建


下一篇:python基础训练day29