LeetCode 面试题 16.19. 水域大小

这篇具有很好参考价值的文章主要介绍了LeetCode 面试题 16.19. 水域大小。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LeetCode 面试题 16.19. 水域大小

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/group-anagrams/description/

博主Github:https://github.com/GDUT-Rp/LeetCode

LeetCode 面试题 16.19. 水域大小

题目:

你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。

示例 1:

输入:
[
  [0,2,1,0],
  [0,1,0,1],
  [1,1,0,1],
  [0,1,0,1]
]
输出: [1,2,4]

提示:

  • 0 < len(land) <= 1000
  • 0 < len(land[i]) <= 1000

解题思路:

方法一:深度优先遍历

遍历矩阵 land \textit{land} land,如果当前遍历的点 ( i , j ) (i,j) (i,j) 满足 l a n d [ i ] [ j ] = 0 land[i][j]=0 land[i][j]=0,那么对 ( i , j ) (i,j) (i,j) 进行深度优先搜索,深度优先搜索的过程如下:

如果 ( i , j ) (i, j) (i,j) 越界或 land [ i ] [ j ] ≠ 0 \textit{land}[i][j] \ne 0 land[i][j]=0,直接返回 0。

land [ i ] [ j ] = − 1 \textit{land}[i][j] = -1 land[i][j]=1,表示该点已经被搜索过,然后对该点的八个相邻点执行深度优先搜索。

返回值为执行的深度优先搜索的结果和加 1。

将所有结果放入一个数组内,然后从小到大进行排序,返回结果。

Golang
func pondSizes(land [][]int) []int {
    // dfs
    rowCount := len(land)
    columnCount := len(land[0])

    var dfs func(i, j int) int
    dfs = func(x, y int) int {
        // out of pointer || != water
        if x < 0 || x >= rowCount || y < 0 || y >= columnCount {
            return 0
        }
        if land[x][y] != 0 {
            return 0
        }
        // mark
        land[x][y] = -1
        res := 1
        for dx := -1; dx <= 1; dx++ {
            for dy := -1; dy <= 1; dy++ {
                // myselft
                if dx == 0 && dy == 0 {
                    continue
                }
                res += dfs(x + dx , y + dy)
            }
        }
        return res
    }

    // sum
    var res []int
    for i := 0; i < rowCount; i++ {
        for j := 0; j < columnCount; j++ {
            if land[i][j] == 0 {
                res = append(res, dfs(i, j))            
            }  
        }
    }

    // sort
    sort.Ints(res)
    return res
}

复杂度分析

时间复杂度: O ( m n × log ⁡ m n ) O(mn \times \log{mn}) O(mn×logmn),其中 m m m n n n 分别是矩阵 land \textit{land} land 的行数和列数。深度优先搜索需要 O ( m × n ) O(m \times n) O(m×n),在最坏情况下,结果数组 res \textit{res} res 的大小为 m n mn mn 的量级,排序需要 O ( m n × log ⁡ m n ) O(mn \times \log{mn}) O(mn×logmn)

空间复杂度: O ( m × n ) O(m \times n) O(m×n)。返回值不计入空间复杂度,最坏情况下,深度优先搜索需要 O ( m × n ) O(m \times n) O(m×n) 的栈空间。

LeetCode 面试题 16.19. 水域大小

方法二:广度优先遍历

Golang
func pondSizes(land [][]int) []int {
    m, n := len(land), len(land[0])
    bfs := func(x, y int) int {
        q, res := [][]int{}, 0
        q, land[x][y] = append(q, []int{x, y}), -1
        for len(q) > 0 {
            x, y, q = q[0][0], q[0][1], q[1:]
            res++
            for dx := -1; dx <= 1; dx++ {
                for dy := -1; dy <= 1; dy++ {
                    if dx == 0 && dy == 0 {
                        continue
                    }
                    if x + dx < 0 || x + dx >= m || y + dy < 0 || y + dy >= n || land[x + dx][y + dy] != 0 {
                        continue
                    }
                    land[x + dx][y + dy] = -1
                    q = append(q, []int{x + dx, y + dy})
                }
            }
        }
        return res
    }
    res := []int{}
    for i := 0; i < m; i++ {
        for j := 0; j < n; j++ {
            if land[i][j] == 0 {
                res = append(res, bfs(i, j))
            }
        }
    }
    sort.Ints(res)
    return res
}

复杂度分析

时间复杂度: O ( m n × log ⁡ m n ) O(mn \times \log{mn}) O(mn×logmn),其中 m m m n n n 分别是矩阵 land \textit{land} land 的行数和列数。广度优先搜索需要 O ( m × n ) O(m \times n) O(m×n),在最坏情况下,结果数组 res \textit{res} res 的大小为 m n mn mn 的量级,排序需要 O ( m n × log ⁡ m n ) O(mn \times \log{mn}) O(mn×logmn)

空间复杂度: O ( m + n ) O(m + n) O(m+n)。返回值不计入空间复杂度,最坏情况下,广度优先搜索需要 O ( m + n ) O(m + n) O(m+n) 的栈空间。文章来源地址https://www.toymoban.com/news/detail-496633.html

到了这里,关于LeetCode 面试题 16.19. 水域大小的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 面试题 16.08. 整数的英语表示

      给定一个整数,打印该整数的英文描述。 示例 1: 输入: 123 输出: “One Hundred Twenty Three” 示例 2: 输入: 12345 输出: “Twelve Thousand Three Hundred Forty Five” 示例 3: 输入: 1234567 输出: “One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven” 示例 4: 输入: 1234567891 输出: “One Billi

    2024年02月06日
    浏览(31)
  • LeetCode讲解篇之面试题 16.25. LRU 缓存

    设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目。 它应该支持以下操作: 获取数据 get 和 写入数据 put 。

    2024年02月09日
    浏览(48)
  • 代码随想录Day4 | 链表02-leetcode24、19、面试题02.07、142

    题目链接:两两交换链表中的节点 思路: 双指针p1、p2,分别指向每次需要交换的节点。交换过程为p2的next指向p1,p1的next指向p2的next, 还需要注意将p1de前一个指针指向交换后的p2以确保不断链 。 1. 空链 or 只有头结点? - 直接返回head,无需做任何修改 2. 交换需要记录前驱

    2024年02月12日
    浏览(39)
  • 【DFS+剪枝】个人练习-Leetcode-面试题 16.04. Tic-Tac-Toe LCCI

    题目链接:https://leetcode.cn/problems/tic-tac-toe-lcci/ 题目大意:给出一个 N*N 的棋盘格 board[][] ,走圈叉棋,判断输赢情况,某一方赢了返回该方的字符,若平局(棋盘满且没有一方赢)返回 Draw ,若结局未定(棋盘未满且没有一方赢)返回 Pending 思路:可以DFS做,并做一部分剪枝

    2024年02月02日
    浏览(36)
  • 代码随想录第四天|LeetCode24. 两两交换链表中的节点,LeetCode19.删除链表的倒数第N个节点,LeetCode面试题 02.07. 链表相交,LeetCode142.环形链表II

    LeetCode24. 两两交换链表中的节点 题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode) 思路: 先定义一个虚拟头结点方便操作。 再就是交换相邻两个元素了, 此时一定要画图,不画图,操作多个指针很容易乱,而且要操作的先后顺序 初始时,cur指向虚拟头结点,然后进行

    2024年02月09日
    浏览(37)
  • 【Leetcode60天带刷】day04链表——24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交

    Leetcode原题链接: 24. 两两交换链表中的节点  给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 示例 2: 示例 3: 提示: 链表中节点的数目在范围  [0, 100]  内 0 =

    2024年02月07日
    浏览(39)
  • 【LeetCode题目详解】24.两两交换链表中的节点19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II day4(补)

      给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 这道题建议使用 虚拟头结点 ,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。 接下来就是

    2024年02月15日
    浏览(40)
  • 精通 TensorFlow 1.x:16~19

    原文:Mastering TensorFlow 1.x 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如何实现目标。——《原则》,生活原则 2.3.c {% raw %} TensorFlow 模型还可用于在移动和嵌入式平台上运行

    2023年04月21日
    浏览(38)
  • 华为OD试题二(文件目录大小、相对开音节、找最小数)

    1. 文件目录大小 参考代码: 2. 相对开音节 参考代码: 3. 找最小数 算法可以参考下图: 参考代码:

    2024年02月04日
    浏览(33)
  • 白盒测试题(13-16道题目+详细代码)

    题 13: 根据下列流程图编写程序实现相应分析处理并显示结果,并设计最少的测试数据进行判定覆盖测试。输入数据打印出“输入 x 值:”、“输入 y 值:”。输出文字“a=”和 a 的值;输出文字“b=”和 b 的值。其中变量 x、y 均须为整型。  

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包