zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    SQL命令优化
    C# 实现快捷键几种方法
    实现把dgv里的数据完整的复制到一张内存表
    DataGridView上下方向键定位
    《大型网站技术架构:核心原理与案例分析》-- 读书笔记 (2) : 大型网站核心架构要素(2) -- 可用性
    《大型网站技术架构:核心原理与案例分析》-- 读书笔记 (2) : 大型网站核心架构要素(1) -- 性能
    Solr6.7 学习笔记(01) -- 目录结构
    《大型网站技术架构:核心原理与案例分析》-- 读书笔记 (1):大型网站发展历程
    浅淡Java多线程
    java 多线程学习笔记(二) -- IO密集型任务
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9396689.html
Copyright © 2011-2022 走看看