题目链接:
力扣https://leetcode-cn.com/problems/battleships-in-a-board/
【分析】因为只能是横向或者纵向,而且每个之间还会空一格,所以直接遍历到X的时候顺着横竖找,把下一个'.'前的X全改成'.'就行了。
class Solution {
public int countBattleships(char[][] board) {
int res = 0;
int m = board.length;
int n = board[0].length;
int i, j, k;
for(i = 0; i < m; i ++){
for(j = 0; j < n; j++){
if(board[i][j] == 'X'){
board[i][j] = '.';
res++;
for(k = i + 1; k < m; k++){
if(board[k][j] == 'X') board[k][j] = '.';
else break;
}
for(k = j + 1; k < n; k++){
if(board[i][k] == 'X') board[i][k] = '.';
else break;
}
}
}
}
return res;
}
}
【进阶】主要是使用O(1)复杂度,并且不改变board的值。官方解法是寻找左上角,左上角是这么定义的:他自己是X,他左边是'.'并且他的上边也是'.'
class Solution {
public int countBattleships(char[][] board) {
int i, j, res = 0, m = board.length, n = board[0].length;
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
if(board[i][j] == 'X' && (i == 0 || board[i - 1][j] == '.') && (j == 0 || board[i][j - 1] == '.')){
res++;
}
}
}
return res;
}
}