JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • algorithm
  • leetcode
JavaInterview.cn
2022-11-07
目录

由斜杠划分区域Java

文章发布较早,内容可能过时,阅读注意甄别。

# 题目

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

给定网格 grid 表示为一个字符串数组,返回 区域的数量 。

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

示例 1:

输入:grid = [" /","/ "]
输出:2

示例 2:

输入:grid = [" /","  "]
输出:1

示例 3:

输入:grid = ["/\\","\\/"]
输出:5
解释:回想一下,因为 \ 字符是转义的,所以 "/\\" 表示 /\,而 "\\/" 表示 \/。

提示:

  • n == grid.length == grid[i].length
  • 1 <= n <= 30
  • grid[i][j] 是 '/'、''、或 ' '

# 思路

区域连接求数量的问题用并查集解决
大方块由N * N的个小方块组成
将小方块按照双线划分顺时针分为0,1,2,3 共4个区域
并且小方块之间是两两连接的 ,左方块的 1区域 与 右方块的 3区域连接,上方块的 2区域 与 下方块的 0 区域连接
当‘/’时,小方块的 0,3 区域连接, 1,2区域连接
当‘\\’时 ,小方块的 0,1区域连接,2,3区域连接
当‘ ’时,小方块4个区域连接
求区域个数实际是求有多少颗树

# 解法


class Solution {
    
	private class UnionFind {
		int[] parent;

		public UnionFind(int size) {
			parent = new int[size];
			for (int i = 0; i < parent.length; i++)
				parent[i] = i;
		}

		public int find(int index) {
			while (index != parent[index])
				index = parent[index];
			return index;
		}

		public void merge(int p, int q) {
			int pRoot = find(p);
			int qRoot = find(q);
			parent[pRoot] = qRoot;
		}
		
	}

	public int regionsBySlashes(String[] grid) {
		int len = grid.length;
		// 总共有 4n * n 个 小区域块
		UnionFind uf = new UnionFind(4 * len * len);
		for (int i = 0; i < len; i++) {
			for (int j = 0; j < len; j++) {
				int start = 4 * (i * len + j);
				switch (grid[i].charAt(j)) {
				case ' ':
					uf.merge(start, start + 1);
					uf.merge(start + 2, start + 3);
					uf.merge(start, start + 2);
					break;
				case '/':
					uf.merge(start, start + 3);
					uf.merge(start + 1, start + 2);
					break;
				case '\\':
					uf.merge(start, start + 1);
					uf.merge(start + 2, start + 3);
					break;
				}
				if(i > 0){
					uf.merge(start, start - 4 * len + 2);
				}
				if(j > 0){
					uf.merge(start + 3, start - 3);
				}
			}
		}
		
		// 此时取出index = parent[index] 的节点即可 即算出有多少颗树就是有多少个区域
		int count = 0;
		for (int i = 0; i < uf.parent.length; i++) {
			if( i == uf.parent[i])
				count++;
		}
		return count;

    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

# 总结

  • 分析出几种情况,然后分别对各个情况实现
微信 支付宝
最近更新
01
1686. 石子游戏VI Java
08-18
02
1688. 比赛中的配对次数 Java
08-18
03
1687. 从仓库到码头运输箱子 Java
08-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式