一、并查集
看文章拉不拉东并查集吃透算法思想
二、题目Leetcode200
具体思路及题解可阅读右边这篇博客详细解题思路及图解
话不多说上代码
class UnionFind {
constructor(n) {
this.size = new Array(n).fill(1)
this.count = n
this.parent = new Array(n).fill(0).map((item, i) => i)
}
Union(p, q) {
const size = this.size
const parent = this.parent
let rootQ = this.Find(q)
let rootP = this.Find(p)
if (rootP === rootQ) return
if (size[rootP] < size[rootQ]) {
parent[rootP] = rootQ
size[rootQ] += size[rootP]
} else {
parent[rootQ] = rootP
size[rootP] += size[rootQ]
}
this.count--
}
Find(x) {
const parent = this.parent
if (parent[x] !== x) {
parent[x] = this.Find(parent[x])
}
return parent[x]
}
}
var numIslands = function (grid) {
var row = grid.length
var col = grid[0].length
var union = new UnionFind(row * col + 1)
var dummy = row * col
var directions = [[0, 1], [1, 0]]
for (let i = 0; i < row; i++) {
for (let j = 0; j < grid[i].length; j++) {
if (grid[i][j] === "0") {
union.Union(dummy, col * i + j)
}
if (grid[i][j] === "1") {
for (let d of directions) {
let newR = i + d[0]
let newC = j + d[1]
if (newR < row && newC < col) {
if (grid[newR][newC] === "1")
union.Union(newR * col + newC, i * col + j)
} else {
continue
}
}
}
}
}
return union.count - 1
};