zoukankan      html  css  js  c++  java
  • 130. 被围绕的区域 leetcode

    思路:

      1. 题意: 将‘O’替换为‘X’ 即 if board[ i ][ j ] == 'O'  :  board[ i ][ j ] == 'X', 但是一旦该元素与四条边相连就保持‘O’

      2. 所以本题只需要先排除与四条边相连的岛屿,题目就转换为刚做的 200.岛屿数量。

      3. 先遍历四条边,将边上的岛屿 从'O' 变成 ‘S‘, 此时board中剩下的所有’O‘都是非边’O‘ 直接遍历成’X‘

      4. 结束后将边岛屿 ’S‘ 全部遍历成’O‘

    收获:

      1. 岛屿数量中用的 那个递归太好用了 一定要背下来,亮点有:

        1) 赋值在一进入函数的时候,就只需要写一遍; 如果在判断的时候写,就可能写两三处,造成遗漏。

          board[x][y] = 'S'

        2)将输入的坐标 (x,y) 做成 列表上下左右,会好看一点  

          dirs = [(x-1,y),(x+1,y),(x,y-1),(x,y+1)]

        3)要先判断范围,再判断取值,不然会 out of index 

          if 0<=r<nr and 0<=c<nc and board[r][c] == 'O': set_to_S(r,c,board)

      2. 函数代码:

      def set_to_S(x,y,board):
                board[x][y] = 'S'
                dirs = [(x-1,y),(x+1,y),(x,y-1),(x,y+1)]
                nr = len(board)
                nc = len(board[0])
                for r,c in dirs:
                    if 0<=r<nr and 0<=c<nc and board[r][c] == 'O':
                        set_to_S(r,c,board)

    代码:

      

    class Solution:
        def solve(self, board: List[List[str]]) -> None:
            """
            Do not return anything, modify board in-place instead.
            """
            def set_to_S(x,y,board):
                board[x][y] = 'S'
                dirs = [(x-1,y),(x+1,y),(x,y-1),(x,y+1)]
                nr = len(board)
                nc = len(board[0])
                for r,c in dirs:
                    if 0<=r<nr and 0<=c<nc and board[r][c] == 'O':
                        set_to_S(r,c,board)
            
            if not board :
                return board
            nr = len(board)
            nc = len(board[0])
            if nr<3 or nc<3:
                return board

            for j in range(nc):
                if board[0][j] == 'O':
                    set_to_S(0,j,board)
                if board[nr-1][j] == 'O':
                    set_to_S(nr-1,j,board)
            for i in range(nr):
                if board[i][0] == 'O':
                    set_to_S(i,0,board)
                if board[i][nc-1] == 'O':
                    set_to_S(i,nc-1,board)

            for i in range(1,nr-1):
                for j in range(1,nc-1):
                    if board[i][j] == 'O':
                        board[i][j] = 'X'
            for i in range(nr):
                for j in range(nc):
                    if board[i][j] == 'S':
                        board[i][j] = 'O'
            return board
  • 相关阅读:
    websocket 心跳及重连
    Liunx下 tomcat自动重启脚本,亲测。
    Node.js 安装配置---菜鸟教程,贼好用
    Linux下安装Perl依赖
    Centos 8 虚拟机访问外网
    以后园子可能用的就比较少了qwq
    酒店之王
    git bash here创建项目时无法使用上下箭头
    Win10搭建IIS实现局域网访问网站
    js判断两个对象是否相同的三种方式
  • 原文地址:https://www.cnblogs.com/ChevisZhang/p/12882065.html
Copyright © 2011-2022 走看看