首页 > 其他分享 >LeetCode 959. 有斜杠划分区域

LeetCode 959. 有斜杠划分区域

时间:2023-04-10 15:45:52浏览次数:49  
标签:959 int Union start grid 斜杠 uf LeetCode ufSize

题目: https://leetcode.cn/problems/regions-cut-by-slashes/description/

题解(参考了讨论区):将初始N*N的网格看做4 * N* N的三角形集合,根据输入合并对应的三角形。

 

 

 

C# 实现

 

public class Solution {
    public int RegionsBySlashes(string[] grid) {
        UnionFind uf = new UnionFind(4 * grid.Length * grid.Length);
        for (int i = 0; i < grid.Length; i++)
        {
            for (int j = 0; j < grid.Length; j++)
            {
                int start = 4 * (i * grid.Length + j);
                switch (grid[i][j])
                {
                    case ' ':
                        uf.Union(start, start + 1);
                        uf.Union(start + 2, start + 3);
                        uf.Union(start, start + 2);
                        break;
                    case '/':
                        uf.Union(start, start + 3);
                        uf.Union(start + 1, start + 2);
                        break;
                    case '\\':
                        uf.Union(start, start + 1);
                        uf.Union(start + 2, start + 3);
                        break;
                }

                if (i > 0)
                {
                    uf.Union(start, start - 4 * grid.Length + 2);
                }

                if (j > 0)
                {
                    uf.Union(start + 3, start - 3);
                }
            }
        }

        return uf.GetGroups();
    }

  //该实现采用了路径压缩算法,以保证最坏情况下合并操作的成本小于logN public class UnionFind { private int[] uf; private int[] ufSize; public UnionFind(int N) { uf = new int[N]; ufSize = new int[N]; for (int i = 0; i < N; i++) { uf[i] = i; ufSize[i] = 1; } } public int Find(int p) { int root = p; while (root != uf[root]) { root = uf[root]; } while (p != root) { int newP = uf[p]; uf[p] = root; p = newP; } return root; } public void Union(int p, int q) { int pRoot = Find(p); int qRoot = Find(q); if (pRoot != qRoot) { if (ufSize[pRoot] > ufSize[qRoot]) { uf[qRoot] = pRoot; ufSize[pRoot] += ufSize[qRoot]; } else { uf[pRoot] = qRoot; ufSize[qRoot] += ufSize[pRoot]; } } } public int GetGroups() { int count = 0; for (int i = 0; i < uf.Length; i++) { if (uf[i] == i) count++; } return count; } } }

  

标签:959,int,Union,start,grid,斜杠,uf,LeetCode,ufSize
From: https://www.cnblogs.com/ayang1/p/17303124.html

相关文章

  • LeetCode 530.二叉搜索树的最小绝对值差
    1.题目:给你一个二叉搜索树的根节点root,返回树中任意两不同节点值之间的最小差值。差值是一个正数,其数值等于两值之差的绝对值。示例1:输入:root=[4,2,6,1,3]输出:1来源:力扣(LeetCode)链接:https://leetcode.cn/problems/minimum-absolute-difference-in-bst著作权归领扣网络所......
  • LeetCode习题——x 的平方根(二分查找)
    ###x的平方根力扣链接:[x的平方根](https://leetcode.cn/problems/sqrtx/)####题目>给你一个非负整数x,计算并返回x的算术平方根。>>由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。>>注意:不允许使用任何内置指数函数和算符,例如pow(x,0.5)或者x*......
  • LeetCode 98.验证二叉搜索树
    1.题目:给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例1:输入:root=[2,1,3]输出:true来源:力扣(LeetCode......
  • Leetcode(剑指offer专项训练)——DFS/BFS专项(2)
    课程顺序题目现在总共有numCourses 门课需要选,记为 0 到 numCourses-1。给定一个数组 prerequisites,它的每一个元素 prerequisites[i] 表示两门课程之间的先修顺序。 例如 prerequisites[i]=[ai,bi] 表示想要学习课程ai ,需要先完成课程bi 。请根据给出的......
  • leetcode56.合并区间-java
    1classSolution{2publicint[][]merge(int[][]intervals){3/*4思路:左区间排序,若intervals[i][0]>=intervals[i-1][1];则重叠5将重叠区间新建放入res数组里,没重叠则放入原数组6*/7List<int[]>......
  • Leetcode(剑指offer专项训练)——DP专项(8)
    最长递增路径题目给定一个 mxn整数矩阵 matrix,找出其中最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。不能在对角线方向上移动或移动到边界外(即不允许环绕)。链接DP但是依旧不能覆盖所有的情况classSolution{public:intlongest......
  • 2023年4月8日leetcode练习心得
    给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 来源:力扣(LeetCode)链接:https://leetcode.cn/problems/sing......
  • leetcode杨辉三角
    给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。出处:leetcode对于此题可以建立一个vector<vector<int>>,对外层开辟numRows行,对内层开辟从零开始每次加一个,并把头尾都置为一,然后根据杨辉三角的规律填入......
  • Leetcode(剑指offer专项训练)——DFS/BFS专项(1)
    计算除法题目给定一个变量对数组equations和一个实数值数组values作为已知条件,其中equations[i]=[Ai,Bi]和values[i]共同表示等式Ai/Bi=values[i]。每个Ai或Bi是一个表示单个变量的字符串。另有一些以数组queries表示的问题,其中queries[j]=[Cj,Dj]......
  • #yyds干货盘点# LeetCode面试题:爬楼梯
    1.简述:假设你正在爬楼梯。需要n 阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1.1阶+1阶2.2阶示例2:输入:n=3输出:3解释:有三种方法可以爬到楼顶。1.1阶+1阶+1阶2.1阶......