遍历
C++
class Solution {
public:
int countBattleships(vector<vector<char>>& board) {
int m = board.size();
int n = board[0].size();
int res = 0;
for (int i = 0; i < m; i++){
for (int j = 0; j < n; j++){
if (board[i][j] == 'X'){
board[i][j] = '.';
// 将之后这一行的所有列置为.
for (int k = j+1; k < n && board[i][k] == 'X'; k++){
board[i][k] = '.';
}
for (int k = i+1; k < m && board[k][j] == 'X'; k++){
board[k][j] = '.';
}
res ++;
}
}
}
return res;
}
};
Python
class Solution:
def countBattleships(self, board: List[List[str]]) -> int:
m, n = len(board), len(board[0])
res = 0
for i in range(0,m):
for j in range(0, n):
if board[i][j] == 'X':
board[i][j] = '.'
for k in range(j+1, n):
if board[i][k] != 'X':
break
board[i][k] = '.'
for k in range(i+1, m):
if board[k][j] != 'X':
break
board[k][j] = '.'
res += 1
return res
枚举起点
发现, 要么行固定,要么列固定,可以发现如果当前位置左上定点都为’X’,则不满足条件。所以如果当前位置为’X’,判断其左上定点是否也是’X’,如果是则不满足。
C++
class Solution {
public:
int countBattleships(vector<vector<char>>& board) {
int m = board.size();
int n = board[0].size();
int res = 0;
for (int i = 0; i < m; i++){
for (int j = 0; j < n; j++){
if (board[i][j] == 'X'){
if (i > 0 && board[i-1][j] == 'X'){
continue;
}
if (j > 0 && board[i][j-1] == 'X'){
continue;
}
res++;
}
}
}
return res;
}
};
Python
class Solution:
def countBattleships(self, board: List[List[str]]) -> int:
return sum(ch == 'X' and not(i > 0 and board[i-1][j] == 'X' or j > 0 and board[i][j-1]=='X') for i, row in enumerate(board) for j, ch in enumerate(row))