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 = inf
        l, r = 0, len(nums) - 1
        while l <= r:
            ans = min(ans, nums[l] + nums[r])
            l += 1
            r -= 1
        return ans / 2

2.灵神:

class Solution:
    def minimumAverage(self, nums: List[int]) -> float:
        n = len(nums)
        nums.sort()
        ans = inf
        for i in range(n // 2):
            j = n - 1 - i
            ans = 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 = 0
        ans = 0
        flag = (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 = 1
        while i <= n:
            if add[i][-1] != 0:
                break
            i += 1
        j = 1
        while j <= m:
            if add[-1][j] != 0:
                break
            j += 1
        ans -= (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]), 0
        up, down = len(grid), 0
        for 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
        # 后缀
        # 递归
        @cache
        def dfs(i: int, j: int) -> int:
            if i == len(nums):
                return 0
            if 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, left
        u, d = down, up
        for 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 = i
        return (r - l + 1) * (d - u + 1) if r >= l and d >= u else 0
    
    def 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 ans
    
    def 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, left
        u, d = down, up
        for 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 = i
        return l, r, u, d

    def 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 0
    
    def 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 - 1
        
        ans = 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 ans
    
    def 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))。

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

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

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

相关文章

策略模式-通过枚举newInstance替代工厂

策略模式-使用枚举newInstance 前言一、枚举类&#xff1a;MarkCheckDataTypeEnum二、抽象类&#xff1a;AbstractMarkChecker三、检查类&#xff1a;MarkPeopleChecker四、demo演示总结 前言 很久没写文章了~~ 吐槽下&#xff1a;入职新公司后&#xff0c;基本在搬砖&#xf…

CppInsights: 学习C++模版的神器

CppInsights&#xff1a;深入理解C代码的利器 C是一门强大而复杂的编程语言&#xff0c;其复杂性主要体现在语言的多层次抽象和丰富的语法特性上。尽管这些特性使得C能够高效地处理复杂的任务&#xff0c;但也给开发者带来了理解和调试代码的巨大挑战。CppInsights正是在这一背…

RabbitMQ(消息队列)

RabbitMQ 它是消息中间件&#xff0c;是在消息的传输过程中保存消息的容器&#xff0c;实现应用程序和应用程序之间通信的中间产品。目前主流消息队列通讯协议是AMQP&#xff08;二进制传输&#xff0c;支持多种语言&#xff09;、JMS&#xff08;HTTP传输&#xff0c;只支持J…

【PyQt5】一文向您详细介绍 setSpacing() 的作用

【PyQt5】一文向您详细介绍 setSpacing() 的作用 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&am…

南昌服务器托管让数据存储更安全

南昌&#xff0c;作为长江中游地区的重要中心城市&#xff0c;近年来经济发展迅速&#xff0c;产业结构不断优化。随着大数据、云计算、人工智能等新一代信息技术的快速发展&#xff0c;南昌的信息化建设步伐不断加快&#xff0c;为企业提供了良好的发展环境。在这样的背景下&a…

LabVIEW技术交流-控件的禁用属性与Mouse Up事件的一个坑

问题来源 我们平时对控件Mouse Up事件触发使用场景不多&#xff0c;可能在按钮控件上会偶尔用到。在一些场景中&#xff0c;我们用按钮的Mouse Up触发事件&#xff0c;但是又希望在某些限制条件下&#xff0c;按钮会被禁用而不能触发事件。 可是当我们禁用按钮时&#xff0c;它…

P2实验室装修标准都有哪些

P2实验室&#xff08;也称为生物安全二级实验室&#xff0c;BSL-2实验室&#xff09;的装修标准需要满足一系列的设计和施工要求&#xff0c;以确保实验室的安全性和功能性。因此&#xff0c;P2实验室装修标准不仅要满足一般实验室的要求&#xff0c;还需符合生物安全的特殊规定…

穿越千年的智慧之光——唐宋时期的节能“黑科技”省油灯

唐宋时期&#xff0c;中国古代科技达到了一个高峰&#xff0c;许多创新发明不仅在当时引领潮流&#xff0c;甚至在今天看来也充满了智慧的光辉。其中&#xff0c;一项名为“省油灯”的发明&#xff0c;便是当时节能减排的杰出代表&#xff0c;连著名诗人陆游都为之倾倒&#xf…

123.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-收邮件功能的完善与优化

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

最强开源模型来了!一文详解 Stable Diffusion 3 Medium 特点及用法

前言 最强开源模型来了&#xff01;一文详解 Stable Diffusion 3 Medium 特点及用法&#xff08;附模型资源包&#xff09; 大家好&#xff0c;我是AI绘画小33~ 备受期待的 Stable Diffusion 3&#xff08;以下简称 “SD3”&#xff09;终于向公众开放了&#xff0c;作为 S…

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

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

用英文介绍纽约:NEW YORK, USA‘s MEGACITY

NEW YORK, USA’s MEGACITY | America’s Largest City Link: https://www.youtube.com/watch?vdzjQ-akB3BI&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index24 The story of New York City, America’s megalopolis. Summary Paragraph 1: The Historical Developm…

站在巨人的肩膀上 C语言理解和简单练习(包含指针前的简单内容)

1.格式化的输入/输出 1.1printf函数 printf函数你需要了解的就是转换说明&#xff0c;转换说明的作用是将内存中的二进制转换成你所需要的格式入%d就是将内存中存储的变量的二进制转化为十进制并打印出来&#xff0c;同时我们可以在%X的转换说明对精度和最小字段宽度的指定&a…

第 133 场 LeetCode 双周赛题解

A 使所有元素都可以被 3 整除的最少操作数 遍历 n u m s nums nums &#xff0c;每有一个不被 3 3 3 整除的数&#xff0c;则操作数加 1 1 1 class Solution {public:int minimumOperations(vector<int>& nums) {int res 0;for (auto x : nums)if (x % 3 ! 0)res…

基于JSP的在线教育资源管理系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果你对在线教育资源管理系统感兴趣或者有相关需求&#xff0c;欢迎在文末找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;IDE、N…

excel表格加密:电脑文件加密的5个方法介绍【新手篇】

为了防止数据泄露&#xff0c;编辑好表格文件后一般都会加上密码。敏感数据的泄露会导致严重的商业损失和声誉损害。Excel表格加密方法有很多&#xff0c;包括金舟文件夹加密大师、金舟ZIP解压缩、工作簿密码设置等方法。 下面分享5个excel表格加密方法&#xff0c;希望能够帮到…

RuoYi-Vue教程

若依搭建 若依版本 官方 若依官方针对不同开发需求提供了多个版本的框架&#xff0c;每个版本都有其独特的特点和适用场景&#xff1a; 前后端混合版本&#xff1a;RuoYi结合了SpringBoot和Bootstrap的前端开发框架&#xff0c;适合快速构建传统的Web应用程序&#xff0c;其…

36.基于多目标螳螂优化算法的微电网优化matlab

微♥关注“电击小子程高兴的MATLAB小屋”获取资源 基于螳螂优化算法的多目标优化算法 求解微电网多目标优化调度 比较不同目标函数寻优对调度结果的影响 第1种.将两个目标函数值归一化相加&#xff0c;取相加后最小的目标值的粒子&#xff0c;即寻找折衷解并画图 第2种寻找…

代码随想录-Day39

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

服务器硬件及RAID配置

目录 一、RAID磁盘阵列 1.概念 2.RAID 0 3.RAID 1 4.RAID 5 5.RAID 6 6.RAID 10 二、阵列卡 1.简介 2.缓存 三、创建 1.创建RAID 0 2.创建RAID 1 3.创建RAID 5 4.创建RAID 10 四、模拟故障 一、RAID磁盘阵列 1.概念 &#xff08;1&#xff09;是Redundant Array …