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.mzph.cn/web/34113.shtml

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

相关文章

Deepl网页版使用方法

Deepl网页版科学使用方法 Deepl 网页版使用方法重要链接使用方式一、在没有使用插件前的Deepl界面二、安装DeepL.Crack.v1.2.7插件三、插件安装后打开[Deepl官网](https://www.deepl.com/zh/translator)即可四、在翻译整篇文章的权限怎么设置 Deepl 网页版使用方法 重要链接 …

rider出现PluginException导致无法启动

目录 项目场景&#xff1a; 问题描述 原因分析&#xff1a; 解决方案&#xff1a; 项目场景&#xff1a; 由于deepinshot不适用于wayland&#xff0c;ubuntu自带的截图又难用的很&#xff0c;所以换了一款截图软件&#xff0c;叫flameshot&#xff0c;可支持在wayland上使…

基于SaaS平台的iHRM管理系统测试学习

目录 目录 1、登录模块 2、员工管理模块 3、Postmannewman软件的安装&#xff0c;学习 1、Postman的使用 2、Postman断言 3、全局变量和环境变量 4、请求时间戳 5、Postman关联 6、批量执行测试用例 7、Postman生成测试报告 8、Postman读取外部数据文件&#xff08…

昇思25天学习打卡营第01天|基本介绍

作为曾经的javaer&#xff0c;本着不断学习的初心&#xff0c;报名了昇思25天的课程&#xff0c;希望自己能学会点东西的目的。 昇思MindSpore介绍 昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 其中&#xff0c;…

【干货】Jupyter Lab操作文档

Jupyter Lab操作文档1. 使用须知2. 定制化Jupyter设置主题显示代码行数设置语言更多设置 3. 认识Jupyter界面4. 初用Jupyter运行调试格式化查看源码 5. 使用Jupyter Terminal6. 使用Jupyter Markdown7. 上传下载文件&#xff08;云服务器中的Jupyter Lab&#xff09;上传文件到…

选好专业还是选好学校

在高考结束后&#xff0c;考生面临的一个重要选择就是在“专业”和“学校”之间进行权衡。这个选择涉及到多个维度&#xff0c;包括课程学习、就业前景、个人兴趣等。下面&#xff0c;我将结合不同专业的优势和未来挑战&#xff0c;从实际场景出发探讨“专业VS学校”的选择方案…

云计算 | 期末梳理(上)

说在前面:云计算(2024)回忆版,单选15题15分,多选15题30分,填空题10空10分,简答题三题25分(6 8 11),计算题两题20分。总的来说,反正就是考PPT上内容的背诵默写o(╥﹏╥)oo。 选择题考得很细,有PPT原题但不多(特别是多选)。填空就那样,也是看你看得仔不仔细,有没…

LeetCode 算法:二叉树的层序遍历 c++

原题链接&#x1f517;&#xff1a;二叉树的层序遍历 难度&#xff1a;中等⭐️⭐️ 题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;roo…

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念&#xff0c;将逐步规范化一个例子&#xff0c;逐级说明每个范式的要求和变换过程。 示例&#xff1a;学生课程登记系统 初始…

【Docker】容器

目录 1. 容器启动 2. 容器启动/重启/停止 3. 进入容器 4. 容器查询 5. docker 镜像的构建 方式一&#xff1a;docker 容器 commit 方式二&#xff1a;Dockerfile 定制镜像 1. 容器启动 docker run –it/-d –p/P –name imageID/name 2. 容器启动/重启/停止 docker sta…

Linux-笔记 全志T113移植正点4.3寸RGB屏幕笔记

目录 前言 线序整理 软件 显示调试 触摸调试 背光调试 前言 由于手头有一块4.3寸的RGB屏幕(触摸IC为GT1151)&#xff0c;正好开发板上也有40Pin的RGB接口&#xff0c;就想着给移植一下&#xff0c;前期准备工作主要是整理好线序&#xff0c;然后用转接板与杜邦线连接验证好…

一篇文章告诉你如何正确使用chatgpt提示词

在chatgpt大火的时候&#xff0c;出现了一波学习chatgpt提示词的热潮&#xff0c;互联网出现很多了使用的学习提示词的课程。其中我觉得斯坦福大学教授吴恩达博士推出prompt engineer课最全面。接下来总结他课程中正确使用提示词工程的方法。 1. 明确目标 明确你希望ChatGPT完…

vue3+ts:监听dom宽高变化函数

一、效果展示 二、代码 getSize.ts import { ref, Ref, watchEffect } from "vue";export const getWidth (domRef: Ref<HTMLElement | null>) > {const width ref<number>(0);const height ref<number>(0);const observer new ResizeObs…

Qt事件传递顺序是怎样的?

1、事件传递顺序规则 在Qt中&#xff0c;事件传递的顺序事件首先传递到目标对象的事件过滤器&#xff0c;然后传递到事件处理函数&#xff0c;最后传递到父对象的事件过滤器和事件处理函数。 为了更好地理解这一过程&#xff0c;下面将通过一个示例来展示事件在父窗口和子窗口…

`lupdate`、`linguist` 和 `lrelease` 是 Qt 中处理翻译的三个关键工具

lupdate、linguist 和 lrelease 是 Qt 中处理翻译的三个关键工具 lupdate、linguist 和 lrelease 是 Qt 中处理翻译的三个关键工具。以下是这些工具的具体使用方法及其流程: 1. lupdate lupdate 工具用于从源代码中提取翻译字符串并生成 .ts 文件。这个文件包含应用程序中的…

IOS Swift 从入门到精通:@escaping 和PreferenceKey

@escaping 在Swift中,@escaping是一个属性关键字,用于标记闭包参数。当一个闭包在函数返回之后才被调用时,这个闭包被称为逃逸闭包(Escaping Closure)。使用@escaping关键字可以告诉Swift编译器,传递给函数的闭包可能会在函数执行完毕后被调用,因此它需要“逃逸”函数的…

投票多功能小程序(ThinkPHP+Uniapp+FastAdmin)

&#x1f389;你的决策小助手&#xff01; 支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、支持数据库私有化部署&#xff0c;Uniapp提供全部无加密源码。​ 一、引言&#xff1a;为什么我们需要多功能投票小程序&#…

小程序的基本使用

【 0 】前言 【 0 】 这个就是js代码的存放地方 app.json // pages/banner/banner.js Page({/*** 页面的初始数据*/data: {},/*** 生命周期函数--监听页面加载*/onLoad(options) {},/*** 生命周期函数--监听页面初次渲染完成*/onReady() {},/*** 生命周期函数--监听页面显示…

【安卓13 源码】RescueParty救援机制

RescueParty机制正是在这个背景下诞生的&#xff0c;当它注意到系统或系统核心组件陷入循环崩溃状态时&#xff0c;就会根据崩溃的程度执行不同的救援行动&#xff0c;以期望让设备恢复到正常使用的状态。 开机后会自动重启&#xff0c;进入Recovery界面。经查找&#xff0c;是…

代码随想录-Day39

62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…