• 419. Battleships in a Board 棋盘上的战舰数量


    [抄题]:

    Given an 2D board, count how many battleships are in it. The battleships are represented with 'X's, empty slots are represented with '.'s. You may assume the following rules:

    • You receive a valid board, made of only battleships or empty slots.
    • Battleships can only be placed horizontally or vertically. In other words, they can only be made of the shape 1xN (1 row, N columns) or Nx1 (N rows, 1 column), where N can be of any size.
    • At least one horizontal or vertical cell separates between two battleships - there are no adjacent battleships.

    Example:

    X..X
    ...X
    ...X
    

    In the above board there are 2 battleships.

     [暴力解法]:

    时间分析:

    空间分析:

     [优化后]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    i - 1 时请务必做好检查也要>=0,就是i >= 1

    if (i >= 1 && board[i - 1][j] == 'X') continue;
    if (j >= 1 && board[i][j - 1] == 'X') continue;

    [思维问题]:

    以为要用dfs,但是题目对所在的位置有特殊要求,就只能老老实实一个个地数了

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    [一句话思路]:

    同一行或者同一列,就只数头不数尾

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    题目对所在的位置有特殊要求,就只能老老实实一个个地数了

    [复杂度]:Time complexity: O(mn) Space complexity: O(1)

    [算法思想:迭代/递归/分治/贪心]:

    [关键模板化代码]:

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

     [是否头一次写此类driver funcion的代码] :

     [潜台词] :

    class Solution {
        public int countBattleships(char[][] board) {
            //ini some variables
            int m = board.length; int n = board[0].length;
            int count = 0;
            
            //cc
            if (board == null || m == 0 || n == 0) return 0; 
    
            //for loop, only add once if qualified
            for(int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (board[i][j] == '.') continue; 
                    if (i >= 1 && board[i - 1][j] == 'X') continue;
                    if (j >= 1 && board[i][j - 1] == 'X') continue;
                    
                    //add
                    count++;
                }
            }
            
            //return
            return count;
        }
    }
    View Code
  • 相关阅读:
    HDU 2192 MagicBuilding
    HDU 2148 Score
    HDU 1847 Good Luck in CET4 Everybody!
    往CImageList中加图标列表
    LoadIcon
    OnInitialUpdate 详解
    设备坐标(DP)、客户坐标(Client)、逻辑坐标(LP)
    Web及网络基础学习(一)
    Qt 下QMessageBox下中文乱码问题
    vs2005菜单:选项项目和解决方案
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9396689.html
Copyright © 2020-2023  润新知