dfs深搜封闭岛屿+动态规划地图里的宝箱+LRU缓存类

这篇具有很好参考价值的文章主要介绍了dfs深搜封闭岛屿+动态规划地图里的宝箱+LRU缓存类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

wangyi

记录一次某大厂笔试的AC过程

dfs深搜封闭岛屿+动态规划地图里的宝箱+LRU缓存类

给定一个二维矩阵,代表一片海域,海域由土地(0)和水域(1)组成,岛屿是由最大(上下左右)4个方向的联通的土地(0)组成的土地群,封闭岛屿则是指完全由1包围的岛屿,请找出封闭岛屿的数量。

dfs深搜封闭岛屿+动态规划地图里的宝箱+LRU缓存类

题中给的图可以看到外围的1已经用蓝色标出来的了,但是真正是封闭岛屿的只有这一块,

dfs深搜封闭岛屿+动态规划地图里的宝箱+LRU缓存类

class Solution:
    def closedIsland(self , grid: List[List[int]]) -> int:
        # write code here
        if not grid or not grid[0]:
            return 0
        m, n = len(grid), len(grid[0])
        dir = [(0,1),(0,-1),(1,0),(-1,0)]
        def dfs(i,j):
            if i<0 or j<0 or i>=m or j >=n:
                return False
            if grid[i][j] == 1:
                return True

            grid[i][j] = 1

            res = [dfs(i+dx,j+dy) for dx, dy in dir]
            return all(res)

        return sum(dfs(i,j) for i in range(m) for j in range(n) if grid[i][j] == 0)

这是一个比较经典的深度搜索问题,我们可以通过遍历每个格子,当遇到土地0时进行四个方向的搜索,同时标记已经遍历过的格子,最直接的办法就是把他变成水域。使用all函数如果iterable的所有元素不为0、''、False或者iterable为空,all(iterable)返回True,否则返回False

dfs深搜封闭岛屿+动态规划地图里的宝箱+LRU缓存类

为了庆祝某游戏周年庆,策划组正在为该游戏设计一次福利活动,他们希望推出一个迷宫寻宝小游戏,让玩家探索迷宫中的宝箱,玩家可以在不同的宝箱中获取不同数量的金币,并最终通过金币兑换游戏中的限定道具。

为了增加玩法的多样性,策划同学希望能够提供2种寻宝地图,但是每个玩家一天只能选择一张寻宝地图进行探索。同时策划同学提供了宝箱价值的列表,但是这个宝箱价值能不能被合理投放在两个地图中尚未验证,因此希望能借助程序的手段来验证宝箱价值的设计是否合理,具体要求如下:
1.每个宝箱必须目只能被放置在一个地图中,不能重复利用。
2.为了确保玩家获得的奖励数量,策划同学提供了一个“保底值”,两张地图的宝箱奖励总和必须都大于等于这个保 底值。

现在需要请你来设计投放程序,假设保底值为k,每个宝箱的价值都是正整数,并被存放干数组nums中,需要通过返回值告诉策划,这样的宝箱价值能够有几种合理的投放方式.

dfs深搜封闭岛屿+动态规划地图里的宝箱+LRU缓存类

由于每个宝箱只能被选择一次,并且需要计算所有可能的宝箱组合,对于每一个宝箱,只存在两种情况,选入当前地图或者不选入当前地图。同时在计算某个价值是否能通过前i个宝箱价值的组合获取时,可能会出现重复计算,使用动态规划存储子问题的结果来提高运行效率。

动态规划过程:

  1. 定义一个dp[i]存储一个地图的宝箱总价值恰好为i的分配的方案数
  2. 状态转移:对于每一个价值为v的宝箱,我们可以选择选入或者不选入当前地图。如果选入,则有dp[i-v]种方案;如果不选入,则有dp[i]种方法,所以dp[i] = dp[i] + dp[i-v]
  3. 初始化状态:没有任何元素时,和为0的方案数为1,所以dp[0] = 1
  4. 遍历整个数组,将i>=k并且i<=total_value-k的方法进行求和
class Solution:
    def countPartitions(self, nums: List[int], k: int) -> int:
        n = len(nums)
        total_value = sum(nums)

        if total_value < 2 * k:
            return 0

        dp = [0] * (total_value + 1)
        dp[0] = 1

        for i in nums:
            for j in range(total_value, i - 1, -1):
                dp[j] += dp[j - i]

        count = sum(dp[i] for i in range(k, total_value - k + 1))
        return count  

第三个设计题设计一个LRU缓存类

dfs深搜封闭岛屿+动态规划地图里的宝箱+LRU缓存类

dfs深搜封闭岛屿+动态规划地图里的宝箱+LRU缓存类文章来源地址https://www.toymoban.com/news/detail-659900.html

到了这里,关于dfs深搜封闭岛屿+动态规划地图里的宝箱+LRU缓存类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • DFS:深搜+回溯+剪枝解决组合问题

                                                   创作不易,感谢支持!!! . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) 该题和前面是类似的,但是用回溯算法,会超

    2024年04月12日
    浏览(39)
  • 岛屿个数(dfs)

    小蓝得到了一副大小为 M × N M×N M × N 的格子地图,可以将其视作一个只包含字符 0 0 0 (代表海水)和 1 1 1 (代表陆地)的二维数组,地图之外可以视作全部是海水,每个岛屿由在上/下/左/右四个方向上相邻的 1 1 1 相连接而形成。 在岛屿 A 所占据的格子中,如果可以从中选

    2024年04月13日
    浏览(30)
  • DFS:深搜+回溯+剪枝解决排列、子集问题

                                        创作不易,感谢三连支持!!  . - 力扣(LeetCode) . - 力扣(LeetCode)  方案1:不合法就continue 方案2:合法才能进循环 . - 力扣(LeetCode) . - 力扣(LeetCode)  策略1:决策树以选不选作为参考,结果为叶子节点 策略2:决策树以选几个

    2024年04月16日
    浏览(66)
  • DFS:深搜+回溯+剪枝解决矩阵搜索问题

                                                   创作不易,感谢三连!!  . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) 1、矩阵搜索问题经常要用到向量,也就是我们可以通过dx和dy来帮助我们定义方向

    2024年04月17日
    浏览(41)
  • 图论岛屿问题DFS+BFS

    leetcode 200 岛屿问题 BFS代码

    2024年02月09日
    浏览(38)
  • 岛屿数量 -- 二维矩阵的dfs算法

    岛屿数量 又被称为 FloodFill 算法

    2024年02月09日
    浏览(42)
  • DFS:二叉树的深搜与回溯

    . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode)  . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) 思路1:全局path+回溯  思路2:形参path记录路径结果 . - 力扣(LeetCode) 思路1:全局path+回溯 思路2:参数path记录路径结果 

    2024年04月16日
    浏览(57)
  • 【算法专题】二叉树中的深搜(DFS)

    深度优先遍历(DFS,全称为 Depth First Traversal),是我们树或者图这样的数据结构中常用的⼀种遍历算法。这个算法会尽可能深的搜索树或者图的分支,直到一条路径上的所有节点都被遍历完毕,然后再回溯到上一层,继续找⼀条路遍历。 在二叉树中,常见的深度优先遍历为

    2024年02月03日
    浏览(43)
  • 跳跃游戏 (DFS->记忆化搜索->动态规划/贪心证明)

            跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步,或者固定步数,直到到达某一位置,可能是数组的最后一个位置,也有可能是某一特别的数值处,也有可能在这个

    2024年02月03日
    浏览(39)
  • 数据结构与算法 | 深搜(DFS)与广搜(BFS)

    在查找二叉树某个节点时,如果把二叉树所有节点理解为解空间,待找到那个节点理解为满足特定条件的解,对此解答可以抽象描述为: 在解空间中搜索满足特定条件的解 ,这其实就是搜索算法(Search)的一种描述。当然也有其他描述,比如是“指一类用于在数据集合中查

    2024年02月08日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包