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 
}
相关推荐
WL_Aurora8 分钟前
备战蓝桥杯国赛【Day 9】
python·算法·蓝桥杯
June bug9 分钟前
【雅思学习笔记】口语Part1&3常见回答句型
职场和发展·学习方法
洛水水12 分钟前
【力扣100题】20.合并 K 个升序链表
算法·leetcode·链表
闻缺陷则喜何志丹13 分钟前
【动态规划 前缀和】P7074 [CSP-J2020] 方格取数|普及+
c++·算法·前缀和·动态规划·洛谷
Liangwei Lin1 小时前
LeetCode 74. 搜索二维矩阵
算法·leetcode·矩阵
phltxy1 小时前
Redis Hash 数据类型:详解命令与实战场景
redis·算法·哈希算法
放羊郎9 小时前
基于ORB-SLAM2算法的优化工作
人工智能·算法·计算机视觉
mask哥9 小时前
力扣算法java实现汇总整理(上)
java·算法·leetcode
如果'\'真能转义说9 小时前
OOXML 文档格式剖析:哈希、ZIP结构与识别
xml·算法·c#·哈希算法
梦梦代码精11 小时前
BuildingAI 上部署自定义工作流智能体:5 个实用技巧
大数据·人工智能·算法·开源软件