leetcode 959. 由斜杠划分区域 python解法 使用并查集 详解

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

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

返回区域的数目。

解法:

将每个小方格分为四个三角形,并进行编号:
在这里插入图片描述

分为三种情况:

为 ’ ’ 时,小方格中的四个三角形都需要连接
在这里插入图片描述

为 ‘\’ 时,需要连接小方格中的0、1和2、3
在这里插入图片描述

为 ‘/’ 时,需要连接小方格中的0、3和1、2
在这里插入图片描述
除此之外,还需要对相邻的小方格进行连接,为了减少运算量,这里选择对右边和下边的小方格进行连接。(需要判断下方或右方是否还有小方格)

因为不管是哪种,小方格的1号三角形都会与右边的3号三角形连接,2号三角形都会与下方的0号三角形连接,因此每个小方格都要与隔壁的进行连接。
在这里插入图片描述
在这里插入图片描述

然后遍历数组,对每一个小方格进行相应的连接,然后判断是否有右边/下边的小方格并进行连接即可。

tip: 因为有左右/上下方格的连接,所以小方格在自身连接时,就已经自然与其他方格建立了连接。

class UnionFindSet():
        def __init__(self):
            self.setSize = 0  #不连通区域
            self.father = {
     }
            
        def add(self,x):  #添加根节点
            if x not in self.father:
                self.father[x] = -1
                self.setSize += 1

        def find(self,x):
            root = x
            while self.father[root] != -1:  #找根节点
                root = self.father[root]

            while (x != root): #路径压缩
                o = self.father[x]  #找x的父节点
                self.father[x] = root  #把x的父节点设置成刚才找到的根
                x = o  #往上一层

            return root

        def merge(self,x, y):
            root_x = self.find(x)
            root_y = self.find(y)
            if root_x != root_y:
                self.father[root_x] = root_y  #合并
                self.setSize -= 1
                

class Solution:
    def regionsBySlashes(self, grid: List[str]) -> int:
        uf = UnionFindSet()
        lenth = len(grid)
        for row in range(lenth):
            for col in range(lenth):
                char = grid[row][col]
                if char == ' ':
                    uf.add((row, col, 0))
                    uf.add((row, col, 1))
                    uf.add((row, col, 2))
                    uf.add((row, col, 3))
                    uf.merge((row, col, 0),(row, col, 1))
                    uf.merge((row, col, 0),(row, col, 2))
                    uf.merge((row, col, 0),(row, col, 3))
                elif char == '\\':
                    uf.add((row, col, 0))
                    uf.add((row, col, 1))
                    uf.add((row, col, 2))
                    uf.add((row, col, 3))
                    uf.merge((row, col, 0),(row, col, 1))
                    uf.merge((row, col, 2),(row, col, 3))
                elif char == '/':
                    uf.add((row, col, 0))
                    uf.add((row, col, 1))
                    uf.add((row, col, 2))
                    uf.add((row, col, 3))
                    uf.merge((row, col, 0),(row, col, 3))
                    uf.merge((row, col, 1),(row, col, 2))
                
                if row < lenth: #连接下面的块
                    uf.add((row + 1, col, 0))
                    uf.merge((row, col, 2),(row + 1, col, 0))
                if col < lenth:  #连接右面的块
                    uf.add((row, col + 1, 3))
                    uf.merge((row, col, 1),(row, col + 1, 3))

        return uf.setSize

你可能感兴趣的:(leetcode,leetcode,python,算法)