leetcode算法题--找出最安全路径

原题链接:https://leetcode.cn/problems/find-the-safest-path-in-a-grid/description/

go 复制代码
func maximumSafenessFactor(grid [][]int) int {
    n := len(grid)
    type pair struct {
        x int
        y int
    }
    p := make([]pair, 0)
    dis := make([][]int, n)
    for i := range dis {
        dis[i] = make([]int, n)
        for j := range dis[i] {
            if grid[i][j] == 1 {
               p = append(p, pair{i, j}) 
            } else {
                dis[i][j] = -1
            }
        }
    }

    dirs := [][]int{{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
    groups := [][]pair{p}
    for len(p) != 0 {
        tmp := p
        p = make([]pair, 0) 
        for _, pa := range tmp {
            for _, dir := range dirs {
                i, j := pa.x, pa.y
                x := i + dir[0] 
                y := j + dir[1]
                if x >= 0 && x < n && y >= 0 && y < n && dis[x][y] < 0 {
                    p = append(p, pair{x, y})
                    dis[x][y] = len(groups)
                }
            } 
        } 
        groups = append(groups, p)
    }

    // 并查集
    m := n * n - 1 
    fa := make([]int, m + 1)
    for i := 0; i <= m; i ++ {
        fa[i] = i
    }
    var find func(x int) int
    find = func(x int) int {
        if fa[x] != x {
            fa[x] = find(fa[x])
        }
        return fa[x]
    }

    nn := len(groups) 
    for i := nn - 2; i > 0; i -- {
       pairs := groups[i] 
       for _, pair := range pairs {
            for _, dir := range dirs {
                i, j := pair.x, pair.y
                x := i + dir[0] 
                y := j + dir[1]
                if x >= 0 && x < n && y >= 0 && y < n && dis[x][y] >= dis[i][j] {
                    fa[find(x*n+y)] = find(i*n+j)
                }
            } 
            if find(0) == find(m) {
                return i 
            }
        }
    } 

    return 0 
}
相关推荐
小雉系统1 小时前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构
唐墨1235 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏6 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
lsc_blog9 小时前
听到优化风声,先准备能由自己掌控的事
数据库·分布式·中间件·职场和发展·重构
通信小呆呆10 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
笑容掩饰我的失落10 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black11 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_9679791214 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔14 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法