zoukankan      html  css  js  c++  java
  • [LeetCode][JavaScript]Surrounded Regions

    Surrounded Regions

    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.

    A region is captured by flipping all 'O's into 'X's in that surrounded region.

    For example,

    X X X X
    X O O X
    X X O X
    X O X X
    

    After running your function, the board should be:

    X X X X
    X X X X
    X X X X
    X O X X
    https://leetcode.com/problems/surrounded-regions/

    想通了其实很简单,但我就是折腾了好久...

    第一轮找外围所有的O,这些点最后肯定不会被替换成X。

    然后进行dfs,与这些点相连的点同样不会是X。

    把这些不可能是X的点都标记成S,最后把所有O替换成X,把所有S替换成O。

    我一开始尝试正着做,先缓存下需要标记的点,一口气都标成X,妥妥的MLE。

    第二次尝试用bfs,先标记成X,如果不行回溯回去改成O,递归太深堆栈爆了...真是拙计

     1 /**
     2  * @param {character[][]} board
     3  * @return {void} Do not return anything, modify board in-place instead.
     4  */
     5 var solve = function(board) {
     6     var m = board.length, n, i, j, queue = [];
     7     for(i = 0; i < m; i++){
     8         n = board[0].length;
     9         for(j = 0; j < n; j++){
    10             if(board[i][j] === 'O' && (i === 0 || i === m - 1 || j === 0 || j === n - 1)){
    11                 queue.push({row : i, col : j});
    12             }
    13            }
    14     }
    15     bfs(queue);
    16     for(i = 0; i < m; i ++){
    17         for(j = 0; j < n; j ++){
    18             if(board[i][j] === 'O'){
    19                 board[i][j] = 'X';
    20             }else if(board[i][j] === 'S'){
    21                 board[i][j] = 'O';
    22             }
    23         }
    24     }
    25 
    26     function bfs(queue){
    27         var i, j;
    28         while(queue.length > 0){
    29             var top = queue.pop();
    30             i = top.row, j = top.col;
    31             if(board[i][j] === 'S'){
    32                 continue;
    33             }
    34             board[i][j] = 'S';
    35             if(board[i + 1] && board[i + 1][j] && board[i + 1][j] === 'O'){
    36                 queue.push({row : i + 1, col : j});
    37             }
    38             if(board[i - 1] && board[i - 1][j] && board[i - 1][j] === 'O'){
    39                 queue.push({row : i - 1, col : j});
    40             }
    41             if(board[i][j + 1] && board[i][j + 1] === 'O'){
    42                 queue.push({row : i, col : j + 1});
    43             }
    44             if(board[i][j - 1] && board[i][j - 1] === 'O'){
    45                 queue.push({row : i, col : j - 1});
    46             }
    47         }
    48     }
    49 };

    TLE:

     1 /**
     2  * @param {character[][]} board
     3  * @return {void} Do not return anything, modify board in-place instead.
     4  */
     5 var solveTLE = function(board) {
     6     var m = board.length, n, i, j;
     7     for(i = 0; i < m; i++){
     8         n = board[0].length;
     9         for(j = 0; j < n; j++){
    10             if(board[i][j] === 'O'){
    11                 bfs([{row : i, col : j}]);
    12             }
    13            }
    14     }
    15     for(i = 0; i < m; i++){
    16         for(j = 0; j < n; j++){
    17             if(board[i][j] === 'A'){
    18                 board[i][j] = 'X';
    19             }
    20         }
    21     }
    22 
    23     function bfs(queue){
    24         var len = queue.length, top, i, j, res;
    25         while(len--){
    26             top = queue.pop();        
    27             i = top.row; j = top.col;
    28             if(!board[i] || !board[i][j]){
    29                 return false;
    30             }
    31             if(board[i][j] === 'O'){                
    32                 queue.push({row : i + 1, col : j});
    33                 queue.push({row : i - 1, col : j});
    34                 queue.push({row : i, col : j + 1});
    35                 queue.push({row : i, col : j - 1});
    36             }
    37         }
    38         if(queue.length !== 0){
    39             board[i][j] = 'A';
    40             res = bfs(queue);
    41             if(!res){
    42                 board[i][j] = 'O';
    43                 return false;
    44             }
    45         }
    46         return true;
    47     }
    48 };

    MLE写得太丑不贴了...

  • 相关阅读:
    B2B商城网站前端开发
    Scss开发临时学习过程||webpack、npm、gulp配置
    移动开发注意几点
    拥有的50个CSS代码片段(上)
    css3基础、(弹性、响应式)布局注意点
    js封装、简单实例源码记录
    ES8
    es7与es8
    Iterator
    Math,Number
  • 原文地址:https://www.cnblogs.com/Liok3187/p/4694933.html
Copyright © 2011-2022 走看看