【LeetCode】803、打砖块

【LeetCode】803、打砖块

文章目录


一、洪水填充DFS、时光倒流

1.1 洪水填充DFS、时光倒流

  1. 先让 炮弹打到的位置 值-1
  2. 天花板第一行, 把 "值1" 洪水填充为 "值2"
  3. 时光倒流: 逆时间顺序, 把炮弹打到的位置 值+1, 若该格子的值为1则把"值1"洪水填充为"值2", 看能增加几个"值2", 就是该格子消除后能掉落几个砖块

第三步, 要排除自己的砖块

go 复制代码
// go
func hitBricks(g [][]int, hits [][]int) []int {
    m, n := len(g), len(g[0])
    ans := make([]int, len(hits))
    if m == 1 {return ans}

    for _, h := range hits { // 炮弹位置值-1
        g[h[0]][h[1]]--
    }

    var dfs func(i,j int) int
    dfs = func(i,j int) int {
        if i < 0 || i == m || j < 0 || j == n || g[i][j] != 1 {return 0}
        g[i][j] = 2
        return 1 + dfs(i-1,j) + dfs(i+1,j) + dfs(i,j-1) + dfs(i,j+1)
    }
    for j := range n { // 天花板洪水填充
        if g[0][j] == 1 {
            dfs(0,j)
        }
    }

    worth := func(i,j int) bool { // 是否值得 时光倒流 时的洪水填充
        return g[i][j] == 1 && (i == 0 || (i > 0 && g[i-1][j] == 2) || (i < m-1 && g[i+1][j] == 2) || (j > 0 && g[i][j-1] == 2) || (j < n-1 && g[i][j+1] == 2))
    }
    for k := len(hits)-1; k >= 0; k-- { // 时光倒流 逆时间顺序 处理每个炮弹
        h := hits[k]
        i,j := h[0],h[1]
        g[i][j]++
        if worth(i,j) {
            ans[k] = dfs(i,j)-1
        }
    }
    return ans
}

二、多语言解法

C p p / G o / P y t h o n / R u s t / J s / T s Cpp/Go/Python/Rust/Js/Ts Cpp/Go/Python/Rust/Js/Ts

cpp 复制代码
// cpp
go 复制代码
// go 同上
python 复制代码
# python
rust 复制代码
// rust
js 复制代码
// js
ts 复制代码
// ts
相关推荐
木井巳14 小时前
【递归算法】二叉搜索树中第K小的元素
java·算法·leetcode·深度优先·剪枝
铉铉这波能秀14 小时前
LeetCode Hot100 中 enumerate 函数的妙用(2026.2月版)
数据结构·python·算法·leetcode·职场和发展·开发
墨有66614 小时前
哈希表从入门到实现,一篇吃透!
数据结构·算法·哈希算法
南极星100514 小时前
我的创作纪念日--128天
java·python·opencv·职场和发展
We་ct14 小时前
LeetCode 228. 汇总区间:解题思路+代码详解
前端·算法·leetcode·typescript
AIpanda88814 小时前
如何借助AI销冠系统提升数字员工在销售中的成效?
算法
啊阿狸不会拉杆14 小时前
《机器学习导论》第 7 章-聚类
数据结构·人工智能·python·算法·机器学习·数据挖掘·聚类
木非哲14 小时前
机器学习--从“三个臭皮匠”到 XGBoost:揭秘 Boosting 算法的“填坑”艺术
算法·机器学习·boosting
小辉同志14 小时前
437. 路径总和 III
算法·深度优先·广度优先
笨笨阿库娅14 小时前
从零开始的算法基础学习
学习·算法