leetcode 959. 由斜杠划分区域

  1. 题目链接 https://leetcode-cn.com/problems/regions-cut-by-slashes/

  2. 题目描述

    1. 在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /\ 或空格构成。这些字符会将方块划分为一些共边的区域。

      (请注意,反斜杠字符是转义的,因此 \"\\" 表示。)。

      返回区域的数目

    2. 示例 1:

      输入:
      [
        " /",
        "/ "
      ]
      输出:2
      解释:2x2 网格如下:
      

      示例 2:

      输入:
      [
        " /",
        "  "
      ]
      输出:1
      解释:2x2 网格如下:
      

      示例 3:

      输入:
      [
        "\\/",
        "/\\"
      ]
      输出:4
      解释:(回想一下,因为 \ 字符是转义的,所以 "\\/" 表示 \/,而 "/\\" 表示 /\。)
      2x2 网格如下:
      

      示例 4:

      输入:
      [
        "/\\",
        "\\/"
      ]
      输出:5
      解释:(回想一下,因为 \ 字符是转义的,所以 "/\\" 表示 /\,而 "\\/" 表示 \/。)
      2x2 网格如下:
      

      示例 5:

      输入:
      [
        "//",
        "/ "
      ]
      输出:3
      解释:2x2 网格如下:
      
  3. 解题思路

    1. 求联通快的个数,使用并查集,如下图所示将 1 × 1的小方块 分成四个小三角形。是我们进行处理的最小单位。当小方块为 ;'\'时,合并0和2,1和3,当方块为 ‘/’时合并0和1,2和3。当小方块为‘ ’ 是四个都合并。
    2. leetcode 959. 由斜杠划分区域_第1张图片
    3. 图片来自于 https://blog.csdn.net/weixin_44482648/article/details/86677819
  4. 代码

    1. python
      class Solution:
          def regionsBySlashes(self, grid):
              if not grid: return 0
              N = len(grid)
      
              u = [i for i in range(4 * N * N)]
              print(u)
              res = 4 * N * N
      
              def _find(a):
      
                  while u[a] != a:
      
                      a = u[a]
      
      
                  return a
      
              def _union(a, b):
                  nonlocal u, res
                  a, b = _find(a), _find(b)
                  u[a] = b
                  res -= a != b
      
              for i in range(N):
                  for j in range(N):
      
                      index = 4 * (i * N + j)
                      #print(index)
                      if grid[i][j] == ' ':  # 四个小方块都联通
                          _union(index, index + 1)
                          _union(index + 1, index + 2)
                          _union(index + 2, index + 3)
                      elif grid[i][j] == '\\':  # 联通 0和1 以及 2和3
                          _union(index, index + 1)
                          _union(index + 2, index + 3)
                      else:  # 联通 0和3以及 1和2
                          _union(index, index + 3)
                          _union(index + 1, index + 2)
      
                      if j != N-1: _union(index + 1, index + 7)
                      if i != N-1: _union(index + 2, index + 4 * N)
              return res
                          
                          

       

你可能感兴趣的:(刷题,leetcode题解)