27、甲板上的战舰

题目描述:
给定一个二维的甲板, 请计算其中有多少艘战舰。 战舰用 'X’表示,空位用 '.'表示。 你需要遵守以下规则:

给你一个有效的甲板,仅由战舰或者空位组成。
战舰只能水平或者垂直放置。换句话说,战舰只能由 1xN (1 行, N 列)组成,或者 Nx1 (N 行, 1 列)组成,其中N可以是任意大小。
两艘战舰之间至少有一个水平或垂直的空位分隔 - 即没有相邻的战舰。
27、甲板上的战舰
进阶:

你可以用一次扫描算法,只使用O(1)额外空间,并且不修改甲板的值来解决这个问题吗?
思路:首先这道题有点懵人,感觉很无厘头,但是当你拿到第一个案例时

X…X
…X
…X
我的分析:
战舰之间如果相邻那么只能算是一个战舰,比如如最后一列的三个X,就是一列,第一个X就是第一个战舰,那么这样就很明确了,如果右边或者下边有X那么就是一个,否则该X就是一个新的战舰,要注意的是如果是边界那么只要判断一边即可(下边或者是右边是’.'即可)
代码:

class Solution {
    public int countBattleships(char[][] board) {
        int count = 0;
		//行
        int row = board.length;
        //列
        int column = board[0].length;
        for (int i = 0; i < row; i++) {
			for (int j = 0; j < column; j++) {
				if(board[i][j] == 'X'){
					//右边和下边都没有
					if(i == row - 1 || board[i + 1][j] == '.'){
						if(j == column - 1 || board[i][j + 1] == '.'){
							count ++;
						}
					}
				}
				
			}
		}
        return count;
    }
}

排名靠前的代码
讲真的,这个代码还是有点复杂

class Solution {
    public int countBattleships(char[][] board) { 
        if(board == null || board.length == 0){
           return 0; 
        }
        
        int rows = board.length; 
        int cols = board[0].length;        
        int count = 0;
        boolean leftSet = false;
        for(int row = 0; row < rows; row++) {
            leftSet = false;
            for(int col = 0; col < cols; col++) {
                if(board[row][col] == 'X') {
                    if(row == 0) {
                        if(!leftSet) count++;
                    } else {
                        if(board[row - 1][col] == '.' && !leftSet) count++;  
                    }
                    leftSet = true;
                } else {
                    leftSet = false;
                }
            }
        }
        
        return count;
    }
}