leetcode 959. 由斜杠划分区域

本篇博客介绍了LeetCode第959题《由斜杠划分区域》。通过示例展示了如何计算网格中由斜杠划分的区域数量,并提供了解题思路和详细的Python代码实现,利用并查集解决联通块计数问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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. 图片来自于 https://blog.youkuaiyun.com/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
                          
                          

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值