[Leetcode][419. 甲板上的战舰] 4种方法:一次遍历,DFS,统计战舰起点
By Long Luo
方法一:一次遍历 + 不修改原始数组
一次扫描,\(O(m \times n)\) 额外空间,使用一个与矩阵同等大小的辅助数组 \(visited\) 记录访问过的位置。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24public static int countBattleships(char[][] board) {
int ans = 0;
int m = board.length;
int n = board[0].length;
boolean[][] visited = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!visited[i][j] && board[i][j] == 'X') {
visited[i][j] = true;
ans++;
for (int k = i + 1; k < m && board[k][j] == 'X'; k++) {
visited[k][j] = true;
}
for (int k = j + 1; k < n && board[i][k] == 'X'; k++) {
visited[i][k] = true;
}
}
}
}
return ans;
}
复杂度分析:
- 时间复杂度:\(O(m \times n \times \max(m, n))\) 。
- 空间复杂度:\(O(m \times n)\) 。
方法二:一次遍历 + 修改原始数组
一次扫描,允许修改原始数组,遍历之后将原来的X
修改为.
。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24public static int countBattleships(char[][] board) {
int ans = 0;
int m = board.length;
int n = board[0].length;
boolean[][] visited = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!visited[i][j] && board[i][j] == 'X') {
visited[i][j] = true;
ans++;
for (int k = i + 1; k < m && board[k][j] == 'X'; k++) {
visited[k][j] = true;
}
for (int k = j + 1; k < n && board[i][k] == 'X'; k++) {
visited[i][k] = true;
}
}
}
}
return ans;
}
复杂度分析:
- 时间复杂度:\(O(m \times n \times \max(m, n))\) 。
- 空间复杂度:\(O(1)\)。