leetcode 959. Regions Cut By Slashes解题报告(python)

959. Regions Cut By Slashes

  1. Regions Cut By Slashes python solution

题目描述

In a N x N grid composed of 1 x 1 squares, each 1 x 1 square consists of a /, , or blank space. These characters divide the square into contiguous regions.
(Note that backslash characters are escaped, so a \ is represented as “\”.)
Return the number of regions.
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

解析

这次的题目对我来说有点难理解,花费了2个小时才算搞懂。
解题的思想是将整块区域划分成四个小三角形,分别标注为0,1,2,3四个区域,如下图所示。
在这里插入图片描述
所以,原共有N×N个元素,但是按照我们的分割方式就会产生4×N×N个分割区域。根据元素的不同,我们将这4×N×N各区域不断融合,统计最后的区域个数,就是最终的划分区域个数。
首先,若元素是‘/’,那么三角形2和3就是一块区域,0和1是一块区域。同理,若元素为若元素是‘\’,那么三角形1和2就是一块区域,0和3是一块区域。若元素是‘ ’,那么三角形0,1,2,3是一块区域。

上段仅考虑自身的区域融合,但是相邻元素间也会形成区域融合。比如,这个正方形块内的三角形0会和它上一排正方形块中三角形2形成一个区域。这个正方形块内的三角形1会和它左边正方形块中三角形3融合成一个区域。这个正方形块内的三角形2会和它下一排正方形块中三角形0形成一个区域。这个正方形块内的三角形3会和它右边正方形块中三角形1融合成一个区域。

令初始的整体区域数为4×N×N,每融合两个区域,就将整体区域个数减一。

class Unionfind:
    def __init__(self,N):
        self.parent=list(range(N))
        self.size=N
        
    def find(self,i):
        if self.parent[i]!=i:
            self.parent[i]=self.find(self.parent[i])
        return self.parent[i]
    
    def Union(self,x,y):
        rootx,rooty=self.find(x),self.find(y)
        if rootx!=rooty:
            self.parent[rootx]=rooty
            self.size-=1
        
class Solution:
    # four triangles _> a square
    # union find
    # time On2
    # space On2
    def regionsBySlashes(self, grid: List[str]) -> int:
        N=len(grid)
        uf=Unionfind(4*N*N)
        for r,line in enumerate(grid):
            for c,val in enumerate(line):
                root=4*(r*N+c)
                      
                if val in '/ ':
                    uf.Union(root,root+1)
                    uf.Union(root+2,root+3)
                if val in '\ ':
                    uf.Union(root,root+3)
                    uf.Union(root+1,root+2)
                    
                if r>0:
                    uf.Union(root,root-4*N+2)
                if c>0:
                    uf.Union(root+1,root-4+3)
                if c+1<N:
                    uf.Union(root+3,root+4+1)
                if r+1<N:
                    uf.Union(root+2,root+4*N)
                    
        return uf.size

Reference

https://leetcode.com/problems/regions-cut-by-slashes/discuss/347893/Python-4-triangles-for-1-square-and-UF

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值