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 imagedef 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:returnimage[sr][sc] = self.new_colordirections = [(-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 imageque = deque([(sr,sc)])old_color = image[sr][sc]image[sr][sc] = colordirections = [(-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] = colorreturn 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] + 1q.append((new_i, new_j))visited.add((new_i, new_j))return dist

1235.规划兼职工作

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

解法:

动态规划+二分查找,又是一个看了很久题解也没看明白的题目。再慢慢研究。

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

边界条件:无

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

空间复杂度:O(n)

class Solution:def jobScheduling(self, startTime, endTime, profit):n = len(startTime)jobs = sorted(zip(startTime, endTime, profit), key=lambda p: p[1])dp = [0] * (n + 1)for i in range(1, n + 1):k = self.binary_search(jobs, jobs[i - 1][0], i)dp[i] = max(dp[i - 1], dp[k] + jobs[i - 1][2])return dp[n]def binary_search(self, arr, x, hi):lo = 0hi -= 1  # 调整为左闭右闭区间while lo <= hi:mid = lo + (hi - lo) // 2if arr[mid][1] <= x:lo = mid + 1else:hi = mid - 1return lo  # 返回第一个大于x的元素的索引

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt构建MSVC2015环境过程

Qt构建MSVC2015环境过程 前言 之前用的Qt都是基于默认的MinGW编译器&#xff0c;由于目前工作的QT界面主要是跑在X86上&#xff0c;所以记录一下Qt配置MSVC2015的配置过程。根据查阅了解以后&#xff0c;个人理解的MinGW跟MSVC的区别在于前者主要是用于跨平台程序构建&#x…

Redis命令 - Hashes命令组常用命令

1、HSET key field value 设置 key 指定的哈希集中指定字段的值。 HSET key field value 返回值&#xff1a;1代表field是一个新的字段。0代表field已存在 如果 key 指定的哈希集不存在&#xff0c;会创建一个新的哈希集并与 key 关联。如果字段在哈希集中存在&#xff0c;它将…

软件需求分析报告—word

技术要求 1.1接口要求 1.2可靠性&#xff0c;稳定性&#xff0c;安全性&#xff0c;先进性&#xff0c;拓展性&#xff0c;性能&#xff0c;响应。 2.系统安全需求 2.1物理设计安全 2.2系统安全设计 2.3网络安全设计 2.4应用安全设计 2.5用户安全管理 进主页获取更多资料

靶场实战(15):OSCP备考之VulnHub STAPLER

打靶思路 资产发现 主机发现服务发现漏洞发现&#xff08;获取权限&#xff09; 21端口/FTP服务 组件漏洞口令漏洞139端口/SMB服务 组件漏洞口令漏洞666端口/doom服务 组件漏洞其它漏洞80端口/HTTP服务 组件漏洞URL漏洞12380端口/HTTP服务 组件漏洞URL漏洞12380端口/HTTPS服务 …

gitee创建远程仓库并克隆远程仓库到电脑

1、首先点加号新建一个仓库 2、输入仓库名&#xff0c;路径会自动填充&#xff0c;填写简单的仓库介绍&#xff0c;先选择私有&#xff0c;在仓库创建之后&#xff0c;可以改为开源 3、打开建好的仓库 4、复制仓库链接 5、打开一个文件夹(想要存储远程仓库的地址)&#xff0c;在…

C# 图解教程 第5版 —— 第24章 预处理指令

文章目录 24.1 什么是预处理指令24.2 基本规则24.3 符号指令&#xff08;#define、#undef &#xff09;24.4 条件编译&#xff08;#if、#else、#elif、#endif&#xff09;24.5 条件编译结构24.6 诊断指令&#xff08;#warning、#error&#xff09;24.7 行号指令&#xff08;#li…

Web后端开发

一、Maven 1.1 简介 1.2 作用 1.3 流程 通过各种插件实现项目的标准化构建。 1.4 安装 1.5 配置环境 1.5.1 当前工程环境 1.5.2 全局环境 1.6 创建 Maven项目 1.7 导入项目 1.8 依赖管理 1.8.1 依赖配置 1.8.2 依赖传递 pom.xml——右键——Diagrams——show dependen…

隧道应用1-netsh端口映射内网

测试环境信息 物理机内网 IP &#xff1a;192.168.249.1 win7 虚拟机 IP &#xff1a; 192.168.249.131 win10 虚拟机 IP &#xff1a;192.168.249.129 我们在 win7 上配置 netsh 端口映射&#xff0c;将 win7 作为跳板机&#xff0c;进而访问到 win10 的服务。 端口映射与…

flutter 打包IOS及常用配置

修改APP名称 项目名字配置是在 ios/Runner/Info.plist 文件中的 dict 下的 CFBundleName testapp 。如下图所示: String里面就可以修改名称 修改项目 &#xff08;testapp&#xff09;的 Logo 图标 iOS 项目 Logo的配置是在 ios/Runner/Assets.xcassets/AppIcon.appiconset 文…

第24集《佛法修学概要》

庚三、不邪淫戒 辛一、解释名义 分五&#xff1a;辛一、解释名义&#xff1b;辛二、具缘成犯&#xff1b;辛三、犯戒轻重&#xff1b;辛四、开缘情况&#xff1b;辛五、持犯得失 请大家打开讲义第六十八页&#xff0c;我们讲到庚三不邪淫戒。这条戒是五戒的第三条。 辛一、解…

TypeScript泛型的高级用法:第三部分

泛型在开发第三方库时非常有用 在本文中&#xff0c;我将介绍如何使用TypeScript泛型来声明一个 defineStore 函数(类似于Pinia库中的 defineStore 函数)来完成以下挑战。在挑战中&#xff0c;我还会介绍一些非常有用的TypeScript知识。掌握了以后&#xff0c;应该会对你的工作…

用 AI 生成 Vue 组件?

大家好我是奇兵&#xff0c;三个月前&#xff0c;Vercel 推出了其 AI 代码生成工具 —— v0&#xff08;v0.dev&#xff09;&#xff0c;这款工具可以快速生成前端组件代码&#xff0c;引起了前端圈的广泛关注。通过简单的描述&#xff0c;v0能够快速生成前端页面&#xff0c;让…

算法第十八天-实现Trie(前缀树)

实现Trie&#xff08;前缀树&#xff09; 题目要求 解题思路 本文是前缀入门教程 从二叉树说起 前缀树&#xff0c;也是一种树。为了理解前缀树&#xff0c;我们先从二叉树说起。常见的二叉树结构是下面这样子的&#xff1a; class TreeNode { int val; TreeNode* left; Tre…

CDSP和CISP证书,选择哪个?

&#x1f3af;CDSP和CISP是两种与信息安全领域相关的专业认证。它们有一些相似之处&#xff0c;但也存在一些显著的区别。本文将详细介绍CDSP认证和CISP认证的相同点和区别。 &#x1f451;CDSP和CISP的相同点&#xff1a; 1.行业认可&#xff1a;CDSP和CISP都是行业广泛认可的…

Linux下通过EDAC功能检测PCIE硬件错误

1 EDAC的作用 The edac kernel modules goal is to detect and report hardware errors that occur within the computer system running under linux. 《Documentation/admin-guide/ras.rst》 EDAC可以检测物理内存的错误 和 PCIE的错误&#xff0c;本文主要分析后者。 2 机…

如何使用WinDiff浏览和对比Windows源代码中的符号和系统调用信息

关于WinDiff WinDiff是一款功能强大的Windows二进制源代码安全分析与调试工具&#xff0c;该工具完全开源&#xff0c;基于Web实现其功能&#xff0c;可以帮助广大研究人员在不同版本的操作系统中浏览和对比Microsoft Windows二进制文件的符号、类型和系统调用信息。其中&…

详解HTTPS加密工作过程

&#x1f697;&#x1f697;&#x1f697;今天给大家分享的是HTTPS加密的工作过程。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; ✈️✈…

PDCA/绩效管理活动

现代绩效管理理论认为&#xff0c;绩效管理活动是一个连续的过程&#xff0c;是指管理者用来确保自己下属员工的工作行为和工作产出与组织的目标保持一致的手段及过程。人们通常用一个循环过程来描述绩效管理的整个过程。我们认为&#xff0c;一个组织的员工绩效管理活动由四个…

NUS CS1101S:SICP JavaScript 描述:一、使用函数构建抽象

原文&#xff1a;1 Building Abstractions with Functions 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 心灵的行为&#xff0c;其中它对简单的想法施加其力量&#xff0c;主要有以下三种&#xff1a;1.将几个简单的想法组合成一个复合的想法&#xff0c;从而形成所…

【深度学习】RTX2060 2080如何安装CUDA,如何使用onnx runtime

文章目录 如何在Python环境下配置RTX 2060与CUDA 101. 安装最新的NVIDIA显卡驱动2. 使用conda安装CUDA Toolkit3. 验证onnxruntime与CUDA版本4. 验证ONNX需求版本5. 安装ONNX与onnxruntime6. 编写ONNX推理代码 如何在Python环境下配置RTX 2060与CUDA 10 RTX 2060虽然是一款较早…