2024.6.25力扣刷题记录-周赛403

目录

一、3194. 最小元素和最大元素的最小平均值

 二、3195. 包含所有 1 的最小矩形面积 I

三、3196. 最大化子数组的总成本

四、3197. 包含所有 1 的最小矩形面积 II


博主在比赛时只过了前两题。剩下跟着灵神做,来自视频:

【状态机 DP【力扣周赛 403】】 https://www.bilibili.com/video/BV1MZ421M74P/?share_source=copy_web&vd_source=dc0e55cfae3b304619670a78444fd795

一、3194. 最小元素和最大元素的最小平均值

1.自写:

class Solution:def minimumAverage(self, nums: List[int]) -> float:nums.sort()ans = infl, r = 0, len(nums) - 1while l <= r:ans = min(ans, nums[l] + nums[r])l += 1r -= 1return ans / 2

2.灵神:

class Solution:def minimumAverage(self, nums: List[int]) -> float:n = len(nums)nums.sort()ans = inffor i in range(n // 2):j = n - 1 - ians = min(ans, nums[i] + nums[j])return ans / 2

 二、3195. 包含所有 1 的最小矩形面积 I

1.自写:

我每次一遇到这种题,就只一股脑用前缀和(笑哭)。

class Solution:def minimumArea(self, grid: List[List[int]]) -> int:# 前缀和n, m = len(grid), len(grid[0])mx = 0ans = 0flag = (0, 0)add = [[0 for _ in range(m + 1)] for _ in range(n + 1)]for i in range(n):for j in range(m):add[i + 1][j + 1] = add[i][j + 1] + add[i + 1][j] - add[i][j] + grid[i][j]if add[i + 1][j + 1] > mx:mx = add[i + 1][j + 1]ans = (i + 1) * (j + 1)flag = ((i + 1), (j + 1))# 找到前面空的i = 1while i <= n:if add[i][-1] != 0:breaki += 1j = 1while j <= m:if add[-1][j] != 0:breakj += 1ans -= (i - 1) * flag[1] + (j - 1) * flag[0] - (i - 1) * (j - 1)return ans

2.灵神:

class Solution:def minimumArea(self, grid: List[List[int]]) -> int:# 边界left, right = len(grid[0]), 0up, down = len(grid), 0for i, row in enumerate(grid):for j, x in enumerate(row):if x:left = min(left, j)right = max(right, j)up = min(up, i)down = i    # 从上到下遍历return (down - up + 1) * (right - left + 1)

三、3196. 最大化子数组的总成本

当时第一反应是dp,但是我当时想的是前缀,没能解决。

灵神:

附一个自己画的状态转移的简单图解:

(1)递归

class Solution:def maximumTotalCost(self, nums: List[int]) -> int:# dp# 后缀# 递归@cachedef dfs(i: int, j: int) -> int:if i == len(nums):return 0if j == 0:return dfs(i + 1, 1) + nums[i]return max(dfs(i + 1, 1) + nums[i], dfs(i + 1, 0) - nums[i])return dfs(0, 0)    # 第一位肯定为正

(2)递推,一比一翻译

class Solution:def maximumTotalCost(self, nums: List[int]) -> int:# dp# 后缀# 递推,一比一翻译n = len(nums)f = [[0, 0] for _ in range(n + 1)]for i in range(n - 1, -1, -1):f[i][0] = f[i + 1][1] + nums[i]f[i][1] = max(f[i + 1][1] + nums[i], f[i + 1][0] - nums[i])return f[0][0]

(3)递推,滑动窗口

class Solution:def maximumTotalCost(self, nums: List[int]) -> int:# dp# 后缀# 递推,滑动窗口n = len(nums)j0, j1 = 0, 0# 切片nums[::-1],会消耗额外空间# reversed()生成迭代器,不会消耗额外空间for x in reversed(nums):j0, j1 = j1 + x, max(j1 + x, j0 - x)return j0

四、3197. 包含所有 1 的最小矩形面积 II

听了讲解后自己写的代码,旋转90度的代码参考视频。

class Solution:def minimumSum(self, grid: List[List[int]]) -> int:n, m = len(grid), len(grid[0])return min(self.f(grid, n, m), self.f(self.rotate(grid, n, m), m, n))def cover(self, grid: List[List[int]], left: int, right: int, up: int, down: int) -> int:# 计算最小面积# 闭区间# 注意区域内可能没有1,区别第二题# 要么返回时判断,要么初始化时设置大一点l, r = right, leftu, d = down, upfor i in range(up, down + 1):for j in range(left, right + 1):if grid[i][j]:l = min(l, j)r = max(r, j)u = min(u, i)d = ireturn (r - l + 1) * (d - u + 1) if r >= l and d >= u else 0def f(self, grid: List[List[int]], n: int, m: int) -> int:ans = 901# 划分横着三个区域if n >= 3:for line1 in range(n - 2):for line2 in range(line1 + 1, n - 1):m1 = self.cover(grid, 0, m - 1, 0, line1)m2 = self.cover(grid, 0, m - 1, line1 + 1, line2)m3 = self.cover(grid, 0, m - 1, line2 + 1, n - 1)ans = min(ans, m1 + m2 + m3)if n >= 2 and m >= 2:for line1 in range(n - 1):for line2 in range(m - 1):# 划分上横下二区域m1 = self.cover(grid, 0, m - 1, 0, line1)m2 = self.cover(grid, 0, line2, line1 + 1, n - 1)m3 = self.cover(grid, line2 + 1, m - 1, line1 + 1, n - 1)ans = min(ans, m1 + m2 + m3)# 划分下横上二区域m1 = self.cover(grid, 0, line2, 0, line1)m2 = self.cover(grid, line2 + 1, m - 1, 0, line1)m3 = self.cover(grid, 0, m - 1, line1 + 1, n - 1)ans = min(ans, m1 + m2 + m3)return ansdef rotate(self, grid: List[List[int]], n: int, m: int) -> List[List[int]]:# 顺时针旋转90度ans = [[0 for _ in range(n)] for _ in range(m)]for i in range(n):for j in range(m):ans[j][n - 1 - i] = grid[i][j]return ans

参考评论区评论(. - 力扣(LeetCode)),事先使用一个覆盖框预处理(想起了R-CNN),修改代码如下:

class Solution:def minimumSum(self, grid: List[List[int]]) -> int:n, m = len(grid), len(grid[0])return min(self.f(grid, n, m), self.f(self.rotate(grid, n, m), m, n))def cover(self, grid: List[List[int]], left: int, right: int, up: int, down: int) -> int:# 计算最小范围# 闭区间l, r = right, leftu, d = down, upfor i in range(up, down + 1):for j in range(left, right + 1):if grid[i][j]:l = min(l, j)r = max(r, j)u = min(u, i)d = ireturn l, r, u, ddef minArea(self, grid: List[List[int]], l: int, r: int, u: int, d: int) -> int:# 注意区域内可能没有1,区别第二题# 要么返回时判断,要么初始化时设置大一点l, r, u, d = self.cover(grid, l, r, u, d)   # 找出最小覆盖范围return (r - l + 1) * (d - u + 1) if r >= l and d >= u else 0def f(self, grid: List[List[int]], n: int, m: int) -> int:# 先事先筛选一个大矩形框left, right, up, down = self.cover(grid, 0, m - 1, 0, n - 1)# left -> 0, right -> m - 1, up -> 0, down -> n - 1ans = 901# 划分横着三个区域if n >= 3:for line1 in range(up, down - 1):for line2 in range(line1 + 1, down):m1 = self.minArea(grid, left, right, up, line1)m2 = self.minArea(grid, left, right, line1 + 1, line2)m3 = self.minArea(grid, left, right, line2 + 1, down)ans = min(ans, m1 + m2 + m3)if n >= 2 and m >= 2:for line1 in range(up, down):for line2 in range(left, right):# 划分上横下二区域m1 = self.minArea(grid, left, right, up, line1)m2 = self.minArea(grid, left, line2, line1 + 1, down)m3 = self.minArea(grid, line2 + 1, right, line1 + 1, down)ans = min(ans, m1 + m2 + m3)# 划分下横上二区域m1 = self.minArea(grid, left, line2, up, line1)m2 = self.minArea(grid, line2 + 1, right, up, line1)m3 = self.minArea(grid, left, right, line1 + 1, down)ans = min(ans, m1 + m2 + m3)return ansdef rotate(self, grid: List[List[int]], n: int, m: int) -> List[List[int]]:# 顺时针旋转90度ans = [[0 for _ in range(n)] for _ in range(m)]for i in range(n):for j in range(m):ans[j][n - 1 - i] = grid[i][j]return ans

 灵神还有一种使用dp进行预处理降低时间复杂度的方法,但是我没学,感觉这暂时不是我能学会的,感兴趣的可以看他的题解(. - 力扣(LeetCode))。

感谢你看到这里!一起加油吧!

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

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

相关文章

BC-Linux 8.6最小化安装的服务器启用GNOME图形化界面

本文记录了BC-Linux 8.6最小化安装的服务器如何启用GNOME图形化界面的过程。 一、服务器环境 1、系统版本 [rootlocalhost ~]# cat /etc/os-release NAME"BigCloud Enterprise Linux" VERSION"8.6 (Core)" ID"bclinux" ID_LIKE"rhel fe…

【C语言】解决C语言报错:Dangling Pointer

文章目录 简介什么是Dangling PointerDangling Pointer的常见原因如何检测和调试Dangling Pointer解决Dangling Pointer的最佳实践详细实例解析示例1&#xff1a;释放内存后未将指针置为NULL示例2&#xff1a;返回指向局部变量的指针示例3&#xff1a;指针悬空后继续使用示例4&…

基于 ESP8266 和 MQ 气体传感器的微信告警系统设计与实现

接线: ESP8266MQ3vVCCGND GND A0 A0微信通知截图: 摘要:本文主要探讨了一种利用 ESP8266 微控制器与 MQ 气体传感器构建的气体检测微信告警系统。详细阐述了系统的硬件组成、软件设计以及与微信平台的交互机制。通过该系统,能够实时监测环境中的气…

解决:Xshell通过SSH协议连接Ubuntu服务器报“服务器发送了一个意外的数据包,received:3,expected:20”

下图所示&#xff1a; 日志也基本看不出来问题在哪&#xff0c;只是说断开了连接大概是验证失败。有幸在某论坛评论区找到了原因&#xff0c;是因为我的xshell版本太低了而服务器的ssh版本太高&#xff0c;高版本的ssh默认屏蔽了一部分不太安全的算法导致建立连接的时候验证失败…

虚拟机装入kali linux

VMware 首先需要先安装VMware Workstation Pro可以根据这篇文章来下载VMware 下载kali linux Installer Images VS Virtual Machines Installer Images&#xff08;安装镜像&#xff09;Virtual Machines&#xff08;虚拟机&#xff09; 直接访问硬件&#xff0c;定制内核…

鸿蒙开发之--生命周期

开发官网 开发-HarmonyOS开发者-华为开发者联盟 UIAbility生命周期 1、首先执行onCreate(),用于页面初始化和设置页面逻辑 2、执行onWindowStageCreate()创建一个窗口&#xff0c;在这里可以使windowStage.loadContent(url&#xff0c;&#xff08;&#xff09;>{})打开一…

大厂薪资福利篇第四弹:字节跳动

欢迎来到绝命Coding&#xff01; 今天继续更新大家最关心的 大厂薪资福利系列&#xff01; 往期分享&#xff1a; 福利开水喝不完&#xff1f;大厂薪资福利篇&#xff01;美团 职场文化发源地&#xff1f;大厂薪资福利篇&#xff01;阿里巴巴 给这么多&#xff01;还能带宠物上…

基于SpringBoot和PostGIS的某国基地可视化实战

目录 前言 一、Java后台开发设计与实现 1、模型层实现 2、控制层设计 二、WebGIS界面实现 1、列表界面的定义 2、全球基地可视化 三、成果展示 1、全球部署情况 2、亚太地区 3、欧洲基地分布 4、中东的部署 四、总结 前言 在之前的博客中&#xff0c;我们曾经对漂亮…

工控必备C#

微软的C# 语言&#xff1f; QT 熟了以后,Qt 更方便些 方法Signal Slot 感觉上一样 现在更推荐PyQt 来构建,底层还是Qt C 的那些库,Qt 的开源协议有点狗

紧跟潮流,攻击者通过NFT分发木马BitRAT

数字货币并不是区块链技术的唯一应用&#xff0c;非同质化代币&#xff08;NFT&#xff09;在 2021 年也走入了大众视野。NFT 是一种数字代币&#xff0c;通过区块链技术验证数字内容和所有权的真实性&#xff0c;例如艺术品、音乐、收藏品和游戏中的物品等。 2021 年 3 月&am…

如何将本地项目推送到gitee仓库

目录 为何用gitee管理自己项目&#xff1a; 如何将自己的项目推送到gitee仓库&#xff0c;步骤如下&#xff1a; 1.下载git 2.生成公钥 3.在gitee上添加公钥 4.在gitee上创建仓库 5.将本地项目推送到gitee仓库 为何用gitee管理自己项目&#xff1a; 1.可以使用多台电脑…

Ilya出走记:SSI的超级安全革命

图片&#xff5c;OpenAI官网 ©自象限原创 作者丨罗辑、程心 和OpenAI分道扬镳以后&#xff0c;Ilya“神秘而伟大”的事业终于揭开了面纱。 6月20日&#xff0c;前OpenAI核心创始人 Ilya Stuskever&#xff0c;在官宣离职一个月后&#xff0c;Ilya在社交媒体平台公开了…

B-splines曲线的绘制(Matlab)

虽然在这个链接三次 Bspline(B样条曲线) NURBS曲线的绘制 matlab_三次b样条曲线的绘制-CSDN博客中我们介绍了NURBS曲线&#xff0c;然而有时候我们通过B-spline曲线也能够解决问题。B-spline曲线作为NURBS曲线的一种特例&#xff0c;这里给出均匀B-spline曲线的表达式&#xff…

⭐最新版!SpringBoot正确集成PageHelper姿势,不再被误导!

GGBond&#x1f508; CSDN的朋友们大家好哇&#xff0c;我是新来的Java练习生 CodeCodeBond&#xff01; 什么是PageHelper&#xff1f; 这里给不知道的人儿说明一下~~ 知道的xdm可以跳过了&#xff01; PageHelper顾名思义是一个 页面 帮手。也就是分页查询的一个好用的工具…

全省高等职业学校大数据技术专业建设暨专业质量监测研讨活动顺利开展

6月21日&#xff0c;省教育评估院在四川邮电职业技术学院组织开展全省高等职业学校大数据技术专业建设暨专业质量监测研讨活动。省教育评估院副院长赖长春&#xff0c;四川邮电职业技术学院党委副书记、校长冯远洪&#xff0c;四川邮电职业技术学院党委委员、副校长程德杰等出席…

一键简易桌签(带背景)-Word插件-大珩助手

问题整理&#xff1a; 如何Word中设计简易桌签&#xff1f;如何设置带背景图的桌签&#xff1f; Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&…

Selenium IED-控制已打开的Chrome浏览器

本文已收录于专栏 《自动化测试》 目录 背景介绍优势特点操作步骤总结提升 背景介绍 在我们进行自动化测试的过程中有时候会遇见一个很棘手的问题那就是登录的过程中需要图片验证码&#xff0c;图片验证码设计的初衷其实就是为了防自动化&#xff0c;防止一些人利用自动工具恶意…

CSS文本超限后使用省略号代替

方案一&#xff1a; 只显示一行&#xff0c;超限后使用省略号代替 .detail {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }方案二&#xff1a; 显示多行&#xff0c;到最后一行还没有显示完&#xff0c;则最后一行多出来的部分使用省略号代替。 .detai…

“Cannot resolve ch.qos.logback:logback-classic:1.2.3”问题解决办法

当我们添加依赖配置时&#xff0c;通常会遇见如下错误&#xff1a; 这个问题是由于项目中使用了 logback-classic 版本1.2.3&#xff0c;但是无法从当前所配置的仓库中解析到这个特定的版本。可以尝试检查依赖配置&#xff0c;确保指定的仓库中包含了 logback-classic 版本1.2.…

H5、Vue3、UniApp实现抖音短视频功能

H5、Vue3、UniApp实现抖音短视频功能 ml-swiper https://ext.dcloud.net.cn/plugin?id18973 可 0 配置&#xff0c;高性能、低代码、全端兼容 APP端效果图 微信小程序端效果图 Vue网页端效果图 ml-swiper 可 0 配置&#xff0c;高性能、低代码、全端兼容 APP端效果图 …