Featured image of post 959. 由斜杠划分区域

959. 由斜杠划分区域

题目描述

在由 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] 是 '/''\'、或 ' '

解法一:并查集

 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
68
69
70
71
72
73
type UnionFind struct {
    parent []int
    rank   []int
}

func NewUnionFind(n int) *UnionFind {
    uf := &UnionFind{parent: make([]int, n), rank: make([]int, n)}
    for i := 0; i < n; i++ {
        uf.parent[i] = i
        uf.rank[i] = 1
    }
    return uf
}

func (uf *UnionFind) Find(i int) int {
    if uf.parent[i] != i {
        uf.parent[i] = uf.Find(uf.parent[i])
    }
    return uf.parent[i]
}

func (uf *UnionFind) Merge(i, j int) {
    iF, jF := uf.Find(i), uf.Find(j)
    if iF != jF {
        if uf.rank[iF] <= uf.rank[jF] {
            uf.parent[iF] = jF
        } else {
            uf.parent[jF] = iF
        }
        if uf.rank[iF] == uf.rank[jF] {
            uf.rank[jF]++
        }
    }
}

func (uf *UnionFind) Count() int {
    count := 0
    for i := 0; i < len(uf.parent); i++ {
        if uf.parent[i] == i {
            count++
        }
    }
    return count
}

func regionsBySlashes(grid []string) int {
    n := len(grid)
    size := 4 * n * n
    uf := NewUnionFind(size)
    for i := 0; i < n; i++ {
        for j, ch := range grid[i] {
            index := 4 * (i*n + j)
            if ch == ' ' {
                uf.Merge(index, index+1)
                uf.Merge(index, index+2)
                uf.Merge(index, index+3)
            } else if ch == '/' {
                uf.Merge(index, index+3)
                uf.Merge(index+1, index+2)
            } else if ch == '\\' {
                uf.Merge(index, index+1)
                uf.Merge(index+2, index+3)
            }
            if j+1 < n {
                uf.Merge(index+1, 4*(i*n+j+1)+3)
            }
            if i+1 < n {
                uf.Merge(index+2, 4*((i+1)*n+j))
            }
        }
    }
    return uf.Count()
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/08/09 11:34:21
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计