【Lintcode】350. Slash Separating
题目地址:
https://www.lintcode.com/problem/350/description
给定一个m×nm\times nm×n的网格,给出一个字符串数组AAA,A[i][j]A[i][j]A[i][j]表示(i,j)(i,j)(i,j)这个格子里的划线,划线有两种,一种是从左上到右下;另一种是从右上到左下;当然也可以没有划线。问这个网格被分成了多少个连通块。
把每个网格分成四个小三角形,这样一共有4mn4mn4mn个小三角形,编号为0∼4mn−10\sim 4mn-10∼4mn−1,然后对于坐标(i,j)(i,j)(i,j)的小网格,其四个三角形的编号按左上右下的顺序可以写为4ij,4ij+1,4ij+2,4ij+34ij, 4ij+1,4ij+2,4ij+34ij,4ij+1,4ij+2,4ij+3。接着开并查集。如果(i,j)(i,j)(i,j)里没有划线,那么这四个三角形都合并起来;如果是左上到右下的划线,则4ij,4ij+34ij,4ij+34ij,4ij+3合并起来,4ij+1,4ij+24ij+1,4ij+24ij+1,4ij+2合并起来;如果是右上到左下的划线,则4ij,4ij+14ij,4ij+14ij,4ij+1合并起来,4ij+2,4ij+34ij+2,4ij+34ij+2,4ij+3合并起来。网格内合并完之后,注意到(i,j)(i,j)(i,j)的右可以和(i,j+1)(i,j+1)(i,j+1)的左合并,(i,j)(i,j)(i,j)的下可以和(i+1,j)(i+1,j)(i+1,j)的上合并。这样合并完之后看一下并查集里有多少个不相交集即可。代码如下:
public class Solution {class UnionFind {private int[] p;int group;public UnionFind(int size) {p = new int[size];for (int i = 0; i < size; i++) {p[i] = i;}group = size;}public int find(int x) {if (p[x] != x) {p[x] = find(p[x]);}return p[x];}public void union(int x, int y) {int px = find(x), py = find(y);if (px != py) {p[px] = py;group--;}}}/*** @param grids: the ractangle.* @return: return the number of parts after separating.*/public int slashSeparating(String[] grids) {// write your code here.int m = grids.length, n = grids[0].length();UnionFind uf = new UnionFind(m * n * 4);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {int a0 = (i * n + j) * 4, a1 = a0 + 1, a2 = a1 + 1, a3 = a2 + 1;char ch = grids[i].charAt(j);if (ch == ' ') {uf.union(a0, a1);uf.union(a1, a2);uf.union(a2, a3);} else if (ch == '/') {uf.union(a0, a1);uf.union(a2, a3);} else if (ch == '\\') {uf.union(a1, a2);uf.union(a0, a3);}if (j < n - 1) {uf.union(a2, a2 + 2);}if (i < m - 1) {uf.union(a3, ((i + 1) * n + j) * 4 + 1);}}}return uf.group;}
}
时间复杂度O(mnlog∗mn)O(mn\log ^* mn)O(mnlog∗mn),空间O(mn)O(mn)O(mn)。
【Lintcode】350. Slash Separating相关推荐
- 【LintCode】算法题 1443. 最长AB子串
描述 给你一个只由字母'A'和'B'组成的字符串s,找一个最长的子串,要求这个子串里面'A'和'B'的数目相等,输出该子串的长度. 这个子串可以为空. s的长度n满足 2<=n<=1000 ...
- 【lintcode】树形数据结构之Maxtree, Tree iterator, remove bst node, 优先队列之动态中位数Median, 矩阵dfs之word search II,最大连
解析 max ksubarray sum: 最大和 of 连续子序列 => 最大和 of k份连续子序列 属于dp,30行代码搞定,注意一些边界. substr diff: 无queu ...
- 【Lintcode】1413. Tree
题目地址: https://www.lintcode.com/problem/tree/description 给定一个无向图,其有树性质,并且顶点编号为111的为树根(也就是这个图是个有根树).要求 ...
- 【Lintcode】1645. Least Subsequences
题目地址: https://www.lintcode.com/problem/1645/ 给定一个长nnn的数组AAA,问AAA最少能分解为多少个严格递减的子序列之并. 在AAA上定义偏序关系< ...
- 【Lintcode】1375. Substring With At Least K Distinct Characters
题目地址: https://www.lintcode.com/problem/substring-with-at-least-k-distinct-characters/description 给定一 ...
- 【Lintcode】1647. Path Search
题目地址: https://www.lintcode.com/problem/path-search/description 给定一个无向图,再给定两个点SSS和TTT,求所有SSS到TTT的简单路径 ...
- 【Lintcode】1799. Sequence Summation
题目地址: https://www.lintcode.com/problem/sequence-summation/description 给定三个数i,j,ki,j,ki,j,k,计算i+(i+1) ...
- 【Lintcode】1367. Police Distance
题目地址: https://www.lintcode.com/problem/1367/ 给定一个m×nm\times nm×n的矩阵,只含1,0,−11,0,-11,0,−1,111表示警察,000 ...
- 【Lintcode】444. Graph Valid Tree II
题目地址: https://www.lintcode.com/problem/444/ 要求设计一个数据结构,可以做如下两个操作: 1.void addEdge(int a, int b)在aaa与b ...
- 【Lintcode】1718. Minimize Malware Spread
题目地址: https://www.lintcode.com/problem/minimize-malware-spread/description 给定一个nnn个节点的无向图,以邻接矩阵给出.每个 ...
最新文章
- 卫星数据现已加入 Azure 豪华套餐,在太空向女神表个白?
- 微信搜索谁把你删除了
- (CCPC 2020 网络选拔赛)HDU 6900 Residual Polynomial(分治 + NTT)
- 领域应用 | 用知识图谱玩唐诗,“唐诗别苑”附庸端午节的别样风雅!
- 掌控谈话~谈价格的秘诀
- 蔚来2018年平均每天亏掉2641万,车辆交付预期环比腰斩
- mac音频剪辑合并软件哪款比较好用,求推荐
- 【小程序】- 微信授权、绑定手机号
- 十年风雨,一个普通程序员的成长之路(三)铜陵:大雪与加班
- 深度学习可解释性研究(二): Understanding Black-box Predictions via Influence Functions(详细公式推导)
- 支持一对多脱机克隆,ORICO发布三款便携式硬盘对拷机 - 超能网
- 区块链搭建eos开发环境
- Zookeeper--四字命令
- 【MySQL 8.0 OCP 1Z0-908认证考试】 题库精讲--第一讲mysqlbackup
- 【珠穆朗玛峰编程练习题】
- Unity 延时的三种方法
- abbyy是什么软件
- nubia,无IMEI码(串号丢失)解救【转】
- idea同时选中多个相同的内容并编辑和替换
- 《低代码指南 》——低代码跟其他 SAAS 软件的区别?