LeetCode:959.由斜杠划分区域——中等

题目:
959.由斜杠划分区域

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

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

返回区域的数目。

示例 1:

输入:
[
" /",
“/ "
]
输出:2
解释:2x2 网格如下:
在这里插入图片描述
示例2:
输入:
[
" /”,
" "
]
输出:1
解释:2x2 网格如下:
在这里插入图片描述
示例3:
输入:
[
“\/”,
“/\”
]
输出:4
解释:(回想一下,因为 \ 字符是转义的,所以 “\/” 表示 /,而 “/\” 表示 /\。)
2x2 网格如下:
在这里插入图片描述
示例4:
输入:
[
“/\”,
“\/”
]
输出:5
解释:(回想一下,因为 \ 字符是转义的,所以 “/\” 表示 /\,而 “\/” 表示 /。)
2x2 网格如下:
在这里插入图片描述
示例5:
输入:
[
“//”,
"/ "
]
输出:3
解释:2x2 网格如下:
在这里插入图片描述
提示:

  1. 1 <= grid.length == grid[0].length <= 30
  2. grid[i][j] 是 ‘/’、’’、或 ’ '。

解题思路:
用并查集,来查找连通区域的数量。每个格子可能被 / 或者 \ 分为上下左右四个部分,然后分别表示出四个部分。

代码:

class Solution:
    def regionsBySlashes(self, grid: List[str]) -> int:
        n = len(grid)
        parent = [i for i in range(4 * n * n)]


        def find(x):
            if x == parent[x]:
                return x
            parent[x] = find(parent[x])
            return parent[x]


        def union(x, y):
            xr = find(x)
            yr = find(y)
            if xr < yr:
                parent[yr] = xr
            elif xr > yr:
                parent[xr] = yr


        for i, row in enumerate(grid):
            for j, s in enumerate(row):
                up = i * n * 4 + j * 4
                down = i * n * 4 + j * 4 + 1
                left = i * n * 4 + j * 4 + 2
                right = i * n * 4 + j * 4 + 3
                if s == ' ':
                    union(up, down)
                    union(up, left)
                    union(up, right)
                elif s == '\\':
                    union(left, down)
                    union(right, up)
                elif s == '/':
                    union(left, up)
                    union(right, down)
                if i > 0:
                    up_down = (i - 1) * n * 4 + j * 4 + 1
                    union(up, up_down)
                if j > 0:
                    right_left = i * n * 4 + (j - 1) * 4 + 3
                    union(right_left, left)
                if i < n - 1:
                    union((i + 1) * n * 4 + j * 4, down)
                if j < n - 1:
                    union(i * n * 4 + (j + 1) * 4 + 2, right)


        res = set()
        for i in range(len(parent)):
            r = find(i)
            res.add(r)
        return len(res)

提交记录:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vicky__3021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值