题目地址:

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相关推荐

  1. 【LintCode】算法题 1443. 最长AB子串

    描述 给你一个只由字母'A'和'B'组成的字符串s,找一个最长的子串,要求这个子串里面'A'和'B'的数目相等,输出该子串的长度. 这个子串可以为空. s的长度n满足 2<=n<=1000 ...

  2. 【lintcode】树形数据结构之Maxtree, Tree iterator, remove bst node, 优先队列之动态中位数Median, 矩阵dfs之word search II,最大连

    解析 max ksubarray sum:  最大和 of 连续子序列 =>   最大和 of  k份连续子序列 属于dp,30行代码搞定,注意一些边界. substr diff:  无queu ...

  3. 【Lintcode】1413. Tree

    题目地址: https://www.lintcode.com/problem/tree/description 给定一个无向图,其有树性质,并且顶点编号为111的为树根(也就是这个图是个有根树).要求 ...

  4. 【Lintcode】1645. Least Subsequences

    题目地址: https://www.lintcode.com/problem/1645/ 给定一个长nnn的数组AAA,问AAA最少能分解为多少个严格递减的子序列之并. 在AAA上定义偏序关系< ...

  5. 【Lintcode】1375. Substring With At Least K Distinct Characters

    题目地址: https://www.lintcode.com/problem/substring-with-at-least-k-distinct-characters/description 给定一 ...

  6. 【Lintcode】1647. Path Search

    题目地址: https://www.lintcode.com/problem/path-search/description 给定一个无向图,再给定两个点SSS和TTT,求所有SSS到TTT的简单路径 ...

  7. 【Lintcode】1799. Sequence Summation

    题目地址: https://www.lintcode.com/problem/sequence-summation/description 给定三个数i,j,ki,j,ki,j,k,计算i+(i+1) ...

  8. 【Lintcode】1367. Police Distance

    题目地址: https://www.lintcode.com/problem/1367/ 给定一个m×nm\times nm×n的矩阵,只含1,0,−11,0,-11,0,−1,111表示警察,000 ...

  9. 【Lintcode】444. Graph Valid Tree II

    题目地址: https://www.lintcode.com/problem/444/ 要求设计一个数据结构,可以做如下两个操作: 1.void addEdge(int a, int b)在aaa与b ...

  10. 【Lintcode】1718. Minimize Malware Spread

    题目地址: https://www.lintcode.com/problem/minimize-malware-spread/description 给定一个nnn个节点的无向图,以邻接矩阵给出.每个 ...

最新文章

  1. 卫星数据现已加入 Azure 豪华套餐,在太空向女神表个白?
  2. 微信搜索谁把你删除了
  3. (CCPC 2020 网络选拔赛)HDU 6900 Residual Polynomial(分治 + NTT)
  4. 领域应用 | 用知识图谱玩唐诗,“唐诗别苑”附庸端午节的别样风雅!
  5. 掌控谈话~谈价格的秘诀
  6. 蔚来2018年平均每天亏掉2641万,车辆交付预期环比腰斩
  7. mac音频剪辑合并软件哪款比较好用,求推荐
  8. 【小程序】- 微信授权、绑定手机号
  9. 十年风雨,一个普通程序员的成长之路(三)铜陵:大雪与加班
  10. 深度学习可解释性研究(二): Understanding Black-box Predictions via Influence Functions(详细公式推导)
  11. 支持一对多脱机克隆,ORICO发布三款便携式硬盘对拷机 - 超能网
  12. 区块链搭建eos开发环境
  13. Zookeeper--四字命令
  14. 【MySQL 8.0 OCP 1Z0-908认证考试】 题库精讲--第一讲mysqlbackup
  15. 【珠穆朗玛峰编程练习题】
  16. Unity 延时的三种方法
  17. abbyy是什么软件
  18. nubia,无IMEI码(串号丢失)解救【转】
  19. idea同时选中多个相同的内容并编辑和替换
  20. 《低代码指南 》——低代码跟其他 SAAS 软件的区别?

热门文章

  1. 英寸和厘米的交互python_Python新手尝试编写厘米到英寸的代码,反之亦然
  2. 使用burpsuite对手机端APP抓包
  3. 公司内部邮件格式范文
  4. Pr入门系列之十四:处理音频
  5. def是c语言特殊标识符吗,typedef和def究竟有什么区别?
  6. 在线log计算机,log换算(log计算器在线)
  7. android 根据颜色值修改背景图的背景色 最简单方法
  8. 带动画的自定义view——做一个移动的箭头
  9. 【转】PHP缓存的实现
  10. 《个人信息保护法》正式施行,拒绝隐私泄露