1020. 飞地的数量
题目地址(1020. 飞地的数量)
https://leetcode-cn.com/problems/number-of-enclaves/
题目描述
前置知识
DFS
hashset
解法一 (暴力法)
思路
这是一个典型的可以使用 DFS 进行解决的一类题目, LeetCode 相关的题目有很多。
对于这种题目不管是思路还是代码都有很大的相似性,我们来看下。
暴力法的思路很简单,我们遍历整个矩阵:
如果遍历到 0,我们不予理会
如果遍历到 1. 我们将其加到 temp
不断拓展边界(上下左右)
如果 dfs 过程中碰到了边界,说明可以逃脱,我们将累加的 temp 清空
如果 dfs 过程之后没有碰到边界,说明无法逃脱。我们将 temp 加到 cnt
最终返回 cnt 即可
关键点解析
visited 记录访问过的节点,防止无限循环。
代码
Python Code:
复杂度分析
时间复杂度:$O(M * N)$
空间复杂度:$O(M * N)$
解法二 (原地标记法)
公司
暂无
思路
上面的解法空间复杂度很差,我们考虑进行优化, 这里我们使用消除法。即使用题目范围外的数据原地标记是否访问, 这样时间复杂度可以优化到 $O(1)$,这是一种非常常见的优化技巧,请务必掌握,另外文章末尾的题目也是类似的技巧,大家可以结合起来练习。
从矩阵边界开始 dfs
如果碰到 1 就将其变成 0
如果碰到 0 则什么都不做
最后我们遍历整个矩阵,数一下 1 的个数即可。
关键点解析
原地标记
代码
Python Code:
复杂度分析
时间复杂度:$O(M * N)$
空间复杂度:$O(1)$
参考
最后更新于