题目描述:
给你一个大小为
m x n
的矩阵board
表示甲板,其中,每个单元格可以是一艘战舰'X'
或者是一个空位'.'
,返回在甲板board
上放置的 战舰 的数量。战舰 只能水平或者垂直放置在
board
上。换句话说,战舰只能按1 x k
(1
行,k
列)或k x 1
(k
行,1
列)的形状建造,其中k
可以是任意大小。两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的战舰)。示例一:
输入:board = [["X",".",".","X"],[".",".",".","X"],[".",".",".","X"]] 输出:2
解题思路:
本题需要注意的是题意比较晦涩难懂,实际上就是寻找不相邻的X块总共有多少块 X在题中表示战舰 连起来的X在本题中一样表示一艘战舰。题目进阶版本需要我们使用O(1)的空间复杂度并且不允许修改board中的值,因此我们可以采用查找战舰头部的方法来计算战舰的数量,首先 遍历每一块甲板的时候判断当前甲板是不是战舰 再者,我们需要判断此时是否为战舰的头部(确定是否是战舰的头部的方法很简单 只需要判断当前战舰的左边和上边是否是战舰即可 如果左边和上边均不为战舰则表示当前的战舰是战舰的头部 反之则不是) 如果是战舰的头部则战舰的数量加一即可,最后返回结果值即可。
代码实现如下:
class Solution {
public:
int countBattleships(vector<vector<char>>& board) {
int ret=0;
for(int i= 0;i<board.size();i++){
for(int j=0;j<board[0].size();j++){
ret += (board[i][j] == 'X' && (i == 0 || board[i - 1][j] != 'X') && (j == 0 || board[i][j - 1] != 'X')) ? 1 : 0;
}
}
return ret;
}
};