Grind75第9天 | 733.图像渲染、542.01矩阵、1235.规划兼职工作

733.图像渲染

题目链接:https://leetcode.com/problems/flood-fill

解法:

可以用深度优先搜索和广度优先搜索。

深度优先搜索。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格的染色,然后继续对其上下左右4个方位进行染色;如果不相同,则进行返回。

因为初始位置的颜色会被修改,所以我们需要保存初始位置的颜色,以便于之后的更新操作。

广度优先搜索。使用队列,每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格的染色,并把上下左右4个方位加入队列。遵循先进先出,而不是把某个位置深挖到底。

需要注意的是,如果算法开始之前,当前的颜色已经和需要染的颜色相同了,就直接返回,因为如果相邻点和当前颜色相同,那么就和需要染的颜色相同,不需要再染,如果相邻点和当前颜色不相同,那么没法染。所以就是不用操作了。

参考题解:BFS+DFS

边界条件:当前的颜色和需要染的颜色相同。

时间复杂度:O(n×m)

空间复杂度:O(n×m)

# DFS
class Solution:
    def floodFill(self, image: List[List[int]], sr: int, sc: int, color: int) -> List[List[int]]:
        # 需要染成的颜色
        self.new_color = color
        # 初始颜色
        self.old_color = image[sr][sc]
        self.dfs(image, sr, sc)
        return image
    
    def dfs(self, image, sr, sc):
        if sr < 0 or sc < 0 or sr >= len(image) or sc >= len(image[0]):
            return
        # 如果相邻的像素不相同,则返回
        if image[sr][sc] != self.old_color:
            return
        # 如果已经被染色,则返回
        if image[sr][sc] == self.new_color:
            return
        
        image[sr][sc] = self.new_color
        directions = [(-1, 0),(1,0),(0, -1),(0, 1)]
        for d in directions:
            self.dfs(image, sr+d[0], sc+d[1])
# BFS
class Solution:
    def floodFill(self, image: List[List[int]], sr: int, sc: int, color: int) -> List[List[int]]:
        # 这个条件如果不加,那么下面可能无限循环
        # 如果当前的颜色就是要染的颜色,那么不同的颜色没法染,相同的颜色不用染,所以不用操作
        if image[sr][sc] == color:
            return image

        que = deque([(sr,sc)])
        old_color = image[sr][sc]
        image[sr][sc] = color

        directions = [(-1,0), (1,0), (0,-1), (0,1)]
        m, n = len(image), len(image[0])
        while que:
            for i in range(len(que)):
                r, c = que.popleft()
                for d in directions:
                    new_r, new_c = r+d[0], c+d[1]
                    if 0 <= new_r < m and 0 <= new_c < n and image[new_r][new_c] == old_color:
                        que.append((new_r, new_c))
                        image[new_r][new_c] = color
        return image

542.01矩阵

题目链接:https://leetcode.com/problems/01-matrix

解法:

这个题动态规划的写法看着很复杂,广度优先搜索的思路非常优雅简洁。

假设矩阵中一共有两个0,其他都是1,如下图的左图所示。首先初始化所有点的距离为0,然后把值为0的这两个点加入队列。接着把0周围的1都计算距离,距离都是1,同时把这些值为1的点加入队列。到弹出值为1的点时,它相邻的且未访问过的点(值也是1),距离都为2,即 dist[i][j] + 1。

这就是大致的思路,从下图也可以看出。

参考题解:BFS

边界条件:无

时间复杂度:O(mn)

空间复杂度:O(mn)

class Solution:
    def updateMatrix(self, mat: List[List[int]]) -> List[List[int]]:
        m,n = len(mat), len(mat[0])
        dist = [[0]*n for _ in range(m)]
        zero_pos = [(i,j) for i in range(m) for j in range(n) if mat[i][j] == 0]

        q = deque(zero_pos)
        visited = set(zero_pos)
        directions = [(-1,0), (1,0), (0,-1), (0,1)]
        while q:
            i, j = q.popleft()
            for d in directions:
                new_i, new_j = i+d[0], j+d[1]
                # 第一轮先把0附近的1都计算距离
                # 第二轮把1附近的1都计算距离
                if 0 <= new_i < m and 0 <= new_j < n and (new_i, new_j) not in visited:
                    dist[new_i][new_j] = dist[i][j] + 1
                    q.append((new_i, new_j))
                    visited.add((new_i, new_j))
        return dist

1235.规划兼职工作

题目链接:https://leetcode.com/problems/maximum-profit-in-job-scheduling

解法:

动态规划+二分查找。这个题的实现细节有些比较坑的地方,我下面总结一下。

1. dp[i]的定义:使用 dp[i] 表示前 i 份兼职工作可以获得的最大报酬,即区间 [0,i−1]的所有兼职工作可以获得的最大报酬。这意味着 dp 是 1 indexed的,而工作的三个列表 starttime, endtime, profit 都是 0 indexed。dp[1] 对应到 starttime[0], endtime[0], profit[0]。

初始时 dp[0]=0=0,表示没有兼职工作时报酬为 0。

2.转移方程:对于 i>0,根据第 i (对应dp中的i,profit中的i-1)份兼职工作是否被选择,我们有以下转移方程:

dp[i] = max(dp[i-1], dp[k] + profit[i-1])

因此我们需要找到小于等于第 i 份兼职的startTime的endTime。这里非常危险,因为存在这种情况:endtime的列表为[1,2,3,3,4],而第1份兼职的startTime=3,那么我们注意到endtime列表中有两个满足条件的3,而我们需要的是第2个而不是第1个。那么怎么处理呢?

我们转为找到第一个大于startTime的endTime,它的下标为k,那么我们真正需要的就是k-1,对应到dp就是dp[k]。

这就是为什么很多题解用了 python 的bisect_right 函数得到第一个大于startTime的索引k,然后直接使用dp[k]的原因。这里其实省略了过程:由k得到k-1,再因为profit[i-1]对应dp[i],所以k-1对应dp[k]。说得也没有很严谨,但就是这个思路。

3. 二分查找的实现:这里二分查找的实现和leetcode的二分查找不一样,leetcode的二分查找,列表中的数是唯一的,不存在重复。但是这个题存在重复的case,比如上面举的例子 [1,2,3,3,4],从中寻找小于等于3的数的索引。如果按照 nums[mid] == 3,return mid,那么得到的就是第1个3的索引,而我们实际想要的是第2个3的索引。

因此二分查找的实现就是同 bisect_right 的功能,返回第一个大于target的数的索引。

参考题解:动态规划+二分查找

边界条件:无

时间复杂度:O(nlogn),排序的复杂度是 O(nlogn),遍历+二分查找的复杂度合计是O(nlogn)

空间复杂度:O(n)

class Solution:
    def jobScheduling(self, startTime, endTime, profit):
        n = len(startTime)
        # 按照endTime升序排列
        jobs = sorted(zip(startTime, endTime, profit), key=lambda p: p[1])
        # dp[i] 是 1 indexed,dp[0]表示无兼职,dp[1]表示1份兼职的最大报酬
        # 但 jobs是 0 indexed,dp[1]对应到jobs[0], dp[2]对应到[0,1]左闭右闭区间的jobs,所以 dp[i] 表示前i份兼职(对应job中的i-1)的最大报酬
        dp = [0] * (n + 1)
        for i in range(1, n + 1):
            k = self.binary_search(jobs, jobs[i - 1][0], i-1)
            dp[i] = max(dp[i - 1], dp[k] + jobs[i - 1][2])
        return dp[n]
    
    def binary_search(self, arr, x, hi):
        lo = 0
        while lo <= hi:
            mid = lo + (hi - lo) // 2
            if arr[mid][1] <= x:
                lo = mid + 1
            else:
                hi = mid - 1
        return lo  # 返回第一个大于x的值的索引

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/331180.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙NEXT来了,操作系统的寒武纪时代

鸿蒙来了&#xff0c;加上Android、iOS&#xff0c;企业又要投入人力物力财力&#xff0c;多支持一个技术阵营的一种技术平台。从IT角度看&#xff0c;是更多的责任&#xff1a;新技能培训、新员工招聘、新小组成立&#xff0c;也是新增的代码、新的bug、新的测试任务&#xff…

智能车培训——硬件篇:电源转换的硬件设计

培训课件及资料 链接&#xff1a;https://pan.baidu.com/s/1IikVfZ04Wl9UmEuizfP12A?pwd89gs 提取码&#xff1a;89gs 一.BUCK降压电路的设计 1.什么是BUCK降压&#xff1f;&#xff08;原理&#xff09; &#xff08;1&#xff09;导通回路与续流回路 电流的环路是电源通…

【H3C】配置AAA认证和Telnet远程登陆,S5130 Series交换机

AAA配置步骤为&#xff1a; 1.开启telent远程登陆服务 2.创建用户&#xff0c;设置用户名、密码、用户的服务类型 3.配置终端登录的数量 4.配置vlan-if的ip地址&#xff0c;用来远程登陆 5.允许对应的vlan通过 1.开启telent远程登陆服务 sys …

react umi/max 页签(react-activation)

思路&#xff1a;通过react-activation实现页面缓存&#xff0c;通过umi-plugin-keep-alive将react-activation注入umi框架&#xff0c;封装页签组件最后通过路由的wrappers属性引入页面。 浏览本博客之前先看一下我的博客实现的功能是否满足需求&#xff0c;实现功能&#xf…

C++I/O流——(4)格式化输入/输出(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

一文极速了解【自注意力机制】

当下如火如荼的大模型&#xff0c;其中的关键技术就是注意力机制&#xff08;Attention&#xff09;&#xff0c;于2015年提出。2017年的“Attention is all you need”一文提出了Transformer模型&#xff0c;去掉RNN&#xff0c;只保留注意力&#xff0c;性能吊打所有机器翻译…

用Airtest快速实现手机文件读写与删除功能

1. 前言 前几天有同学留言&#xff0c;能不能安排“读写手机文件”的示例。我们今天就来实现这个小功能。 当然&#xff0c;熟悉adb的同学&#xff0c;看到这个需求&#xff0c;肯定很开心&#xff0c;不就是一个 adb push 和 adb pull 嘛&#xff0c;非常简单呀。 确实如此&…

Python 利用pandas对数据进行特定排序

背景 小编最近在处理hive表存储大小时&#xff0c;需要对每个表的大小进行排序&#xff0c;因通过 hadoop fs -du -s -h /path/table 命令获取的数据表大小&#xff0c;其结果是展示为人能直观理解的大小&#xff0c;例如 1.1T、1.9G、49.6M 等&#xff0c;如果想对这些表根据…

如何安装配置VisualSVN服务并实现公网访问本地服务【内网穿透】

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

2018年认证杯SPSSPRO杯数学建模A题(第一阶段)海豚与沙丁鱼全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 探究海豚猎捕时沙丁鱼群的躲避运动模型 A题 海豚与沙丁鱼 原题再现&#xff1a; 沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗&#xff0c;所以在距离较远时&#xff0c;海豚只能使用回声定位方法来判断鱼群的整体位置&#xf…

网页版短信系统功能简介|短信平台开发搭建源码

网页版短信系统功能简介|短信平台开发搭建源码 随着互联网的发展&#xff0c;科技的进步和人们对通讯方式的需求不断增加&#xff0c;短信成为了人们日常生活中必不可少的沟通工具之一。而网页版短信系统的出现&#xff0c;为人们提供了更加便捷和灵活的短信发送和接收方式。 网…

Ant Design Vue上传多个图片

模板代码&#xff1a; 定义变量&#xff1a; 文件限制的函数&#xff1a; 上传的函数&#xff1a; 样式函数&#xff1a; 完整代码&#xff1a; <template><div class"dialog-upload" v-if"showUploadDialog"><div class"dialog-uplo…

MySQL 基于创建时间进行RANGE分区

MySQL是一款广泛使用的关系型数据库。在MySQL中&#xff0c;大量数据场景提高查询效率是非常关键的&#xff0c;所以&#xff0c;对数据表进行分区是一个很好的选择。 在创建分区表之前&#xff0c;需要了解一下MySQL分区的基本概念。MySQL分区可以将一个大表分成多个小表&…

学习JavaEE的日子 day14 继承,super(),this(),重写

Day14 1.继承的使用 理解&#xff1a;子类继承父类所有的属性和方法 使用场景&#xff1a;多个类似的类&#xff0c;有相同的属性和方法&#xff0c;就可以把相同属性和方法抽取到父类 优点&#xff1a;减少代码的冗余&#xff1b; 使类与类之间产生了关系(多态的前提) 缺点&a…

前端实现轮训和长连接

简介 轮训和长连接相关内容可以参考之前的文章消息推送系统。消息推送系统-CSDN博客文章浏览阅读106次。在餐饮行业中&#xff0c;店内应用有pos、厨显屏等&#xff0c;云端应用为对应数据中心。为了实现云端数据和操作指令下发到店内应用&#xff0c;需要有一个系统实现这个功…

群晖nas内网穿透

目录 一、前言 二、操作步骤 &#xff08;一&#xff09;查看群晖是否有ipv6地址 &#xff08;二&#xff09;下载安装docker &#xff08;三&#xff09;docker里面安装ddns-go &#xff08;四&#xff09;阿里云官网购买域名 &#xff08;五&#xff09;域名解析 阿里…

Yolov8_使用自定义数据集训练模型1

前面几篇文章介绍了如何搭建Yolov8环境、使用默认的模型训练和推理图片及视频的效果、并使用GPU版本的torch加速推理、导出.engine格式的模型进一步利用GPU加速&#xff0c;本篇介绍如何自定义数据集&#xff0c;这样就可以训练出识别特定物体的模型。 《Yolov8_使用自定义数据…

AuxTools - 浮鱼渗透辅助工具箱 V4.2

免责声明 由于传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章及作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&#xff01;如有侵权烦请告知&#xff0c;我们会立即删除并致歉。谢谢&#xff…

【学习总结】动力学方程的龙格库塔积分法(含具体例子与代码)

本文仅用于个人学习总结&#xff0c;如有错误请批评指正。 参考资料 徐超江等&#xff0c;常微分方程基础教程&#xff0c;高等教育出版社&#xff0c;2023年。 1、欧拉法 1.1 前向欧拉 欧拉积分部分不用展开介绍&#xff0c;较为简单。直接拍照课本。 1.2 梯形法/隐式格式…

4D毫米波雷达——原理、对比、优势、行业现状

前言 4D 毫米波雷达是传统毫米波雷达的升级版&#xff0c;4D指的是速度、距离、水平角度、垂直高度四个维度。 相比传统 3D 毫米波雷达&#xff0c;4D 毫米波雷达增加了“高度”的探测&#xff0c;将第四个维度整合到传统毫米波雷达中。 4D毫米波雷达被视为未来车载雷达的一…