Tony's Log

Algorithms, Distributed System, Machine Learning

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

The follow-up question is fun: "Could you do it in one-pass, using only O(1) extra memory and without modifying the value of the board?"

When we meet an 'X', we need to check if it is vertical or horizontal: they will never happen at the same time, by problem statement. For horizontal, we simply stripe through right, and plus 1 - however, if our top element is 'X' already, it is a vertical and counter has alread been increased.

class Solution {
public:
    int countBattleships(vector<vector<char>>& board) {
        int h = board.size();
        if (!h) return 0;
        int w = board[0].size();
        if (!w) return 0;
        
        int cnt = 0;
        for(int i = 0; i < h; i ++)
        for(int j = 0; j < w; j ++)
        {
            if(board[i][j] == 'X') 
            {
                // is it a counted vertical case?
                if(!(i > 0 && board[i -1][j] == 'X'))
                {
                    cnt ++;
                    // Horizontal
                    while(j < (w - 1) && board[i][j + 1] == 'X') j ++;
                }
            }
        }
        
        return cnt;
    }
};
posted on 2017-01-06 07:11  Tonix  阅读(126)  评论(0编辑  收藏  举报