tft每日頭條

 > 生活

 > leetcode困難題

leetcode困難題

生活 更新时间:2025-01-13 14:09:19
題目

在由 1 x 1 方格組成的 N x N 網格 grid 中,每個 1 x 1 方塊由 /、\ 或空格構成。這些字符會将方塊劃分為一些共邊的區域。

(請注意,反斜杠字符是轉義的,因此 \ 用 "\\" 表示。)。

返回區域的數目。

示例 1:輸入:

[

" /",

"/ "

]

輸出:2

解釋:2x2 網格如下:

示例 2:輸入:

[

" /",

" "

]

輸出:1

解釋:2x2 網格如下:

示例 3:輸入:

[

"\\/",

"/\\"

]

輸出:4

解釋:(回想一下,因為 \ 字符是轉義的,所以 "\\/" 表示 \/,而 "/\\" 表示 /\。)

2x2 網格如下:

示例 4:輸入:

[

"/\\",

"\\/"

]

輸出:5

解釋:(回想一下,因為 \ 字符是轉義的,所以 "/\\" 表示 /\,而 "\\/" 表示 \/。)

2x2 網格如下:

示例 5:輸入:

[

"//",

"/ "

]

輸出:3

解釋:2x2 網格如下:

提示:1 <= grid.length == grid[0].length <= 30

grid[i][j] 是 '/'、'\'、或 ' '。

解題思路分析

1、并查集;時間複雜度O(n^2log(n)),空間複雜度O(n^2)

func regionsBySlashes(grid []string) int { n := len(grid) fa = Init(n * n * 4) for i := 0; i < n; i { for j := 0; j < n; j { index := 4 * (i*n j) // 擴大4倍,每個格子拆分為4個:0、1、2、3(順時針) if grid[i][j] == '/' { union(index, index 3) // 合并0、3 union(index 1, index 2) // 合并1、2 } else if grid[i][j] == '\\' { union(index, index 1) // 合并0、1 union(index 2, index 3) // 合并2、3 } else { union(index, index 1) // 合并0、1、2、3 union(index 1, index 2) union(index 2, index 3) } if j < n-1 { union(index 1, index 7) // 向右合并 } if i < n-1 { union(index 2, index 4*n) // 向下合并 } } } return getCount() } var fa []int var count int // 初始化 func Init(n int) []int { arr := make([]int, n) for i := 0; i < n; i { arr[i] = i } count = n return arr } // 查詢 func find(x int) int { if fa[x] == x { return x } // 路徑壓縮 fa[x] = find(fa[x]) return fa[x] } // 合并 func union(i, j int) { x, y := find(i), find(j) if x != y { fa[x] = y count-- } } func query(i, j int) bool { return find(i) == find(j) } func getCount() int { return count }

2、深度優先搜索;時間複雜度O(n^2),空間複雜度O(n^2)

leetcode困難題(leetcode959go由斜杠劃分區域)1

func regionsBySlashes(grid []string) int { n := len(grid) arr := make([][]int, 3*n) for i := 0; i < 3*n; i { arr[i] = make([]int, 3*n) } for i := 0; i < n; i { // 放大處理 for j := 0; j < n; j { if grid[i][j] == '/' { // 9宮格 arr[i*3 2][j*3] = 1 arr[i*3 1][j*3 1] = 1 arr[i*3][j*3 2] = 1 } else if grid[i][j] == '\\' { arr[i*3 2][j*3 2] = 1 arr[i*3 1][j*3 1] = 1 arr[i*3][j*3] = 1 } } } res := 0 for i := 0; i < 3*n; i { for j := 0; j < 3*n; j { if arr[i][j] == 0 { dfs(arr, i, j) res } } } return res } func dfs(arr [][]int, i, j int) { if 0 <= i && i < len(arr) && 0 <= j && j < len(arr[0]) && arr[i][j] == 0 { arr[i][j] = 1 dfs(arr, i 1, j) dfs(arr, i-1, j) dfs(arr, i, j-1) dfs(arr, i, j 1) } }

總結

Medium題目,簡單一些思路就是進行放大處理,把單個字符轉換為9宮格,然後題目就變成 leetcode 200.島嶼數量

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved