力扣每日一题 6/19 排序+动态规划

  • 博客主页:誓则盟约
  • 系列专栏:IT竞赛 专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍ 

2713.矩阵中严格递增的单元格数【困难

题目:

给你一个下标从 1 开始、大小为 m x n 的整数矩阵 mat,你可以选择任一单元格作为 起始单元格 。

从起始单元格出发,你可以移动到 同一行或同一列 中的任何其他单元格,但前提是目标单元格的值 严格大于 当前单元格的值。

你可以多次重复这一过程,从一个单元格移动到另一个单元格,直到无法再进行任何移动。

请你找出从某个单元开始访问矩阵所能访问的 单元格的最大数量 。

返回一个表示可访问单元格最大数量的整数。

示例 1:

输入:mat = [[3,1],[3,4]]
输出:2
解释:上图展示了从第 1 行、第 2 列的单元格开始,可以访问 2 个单元格。可以证明,无论从哪个单元格开始,最多只能访问 2 个单元格,因此答案是 2 。 

示例 2:

输入:mat = [[1,1],[1,1]]
输出:1
解释:由于目标单元格必须严格大于当前单元格,在本示例中只能访问 1 个单元格。

 示例 3:

输入:mat = [[3,1,6],[-9,5,7]]
输出:4
解释:上图展示了从第 2 行、第 1 列的单元格开始,可以访问 4 个单元格。可以证明,无论从哪个单元格开始,最多只能访问 4 个单元格,因此答案是 4 。

分析问题:

       这道题旨在寻找一个最大解,可以用动态规划来解,而题意又是让我们顺序移动单元格,只能从小到大的顺序,因此我们可以用一个哈希表来记录每个值所对应的坐标,遍历每个可能的起点。

        在这个过程中,我们可以维护两个数组 rowMax 和 colMax,分别记录每一行和每一列的最大递增长度。初始时,这两个数组的所有元素都为 0。

        对于每个值对应的所有单元格位置,我们按照位置顺序遍历,对于每个位置 (i,j),我们可以计算出以该位置为终点的最大递增长度为 1+max(rowMax[i],colMax[j]),更新答案,然后更新 rowMax[i] 和 colMax[j]

代码实现:

class Solution:def maxIncreasingCells(self, mat: List[List[int]]) -> int:M = len(mat)N = len(mat[0])# 建立一个哈希表value_buckets = defaultdict(list)for i in range(M):for j in range(N):value_buckets[mat[i][j]].append((i, j))row_best = [0] * Mcol_best = [0] * Nans = 0for val in sorted(value_buckets.keys()):cells = value_buckets[val]updates = []for r, c in cells:mx = 1 + max(row_best[r], col_best[c])updates.append((r, c, mx))ans = max(ans, mx)for r, c, mx in updates:row_best[r] = max(row_best[r], mx)col_best[c] = max(col_best[c], mx)return ans

 


 

总结:

代码详解:

        首先,通过 len(mat) 和 len(mat[0]) 分别获取了输入矩阵 mat 的行数 M 和列数 N 。

        然后,创建了一个默认字典 value_buckets 。在接下来的两层循环中,遍历矩阵 mat 的每个元素。对于每个元素的值,将其对应的坐标 (i, j) 添加到 value_buckets 中以该值为键的列表中。

        接着,创建了两个列表 row_best 和 col_best ,分别用于记录每行和每列的最佳值,并初始化为全 0 。还初始化了一个变量 ans 用于保存最终的结果,并初始化为 0 。

        之后,对 value_buckets 中的键(即矩阵中的值)进行排序。对于每个排序后的键值 val ,获取对应的坐标列表 cells 。然后创建一个空列表 updates 用于保存后续的更新信息。

        在遍历 cells 中的每个坐标 (r, c) 时,计算当前位置能达到的最大值 mx ,它等于 1 加上 row_best[r] 和 col_best[c] 中的最大值。将 (r, c, mx) 添加到 updates 列表中,并更新 ans 为 ans 和 mx 中的最大值。

        最后,再次遍历 updates 列表,更新 row_best[r] 和 col_best[c] 为它们自身和 mx 中的最大值。

        最终,方法返回 ans ,即矩阵中按照特定规则能达到的最大结果值。


主要考查内容

  1. 对二维列表的遍历和操作。
  2. 使用默认字典 defaultdict 来根据值存储坐标。
  3. 对值进行排序,并基于排序后的结果进行一系列计算和更新操作。
  4. 维护两个分别记录每行和每列最佳值的列表 row_best 和 col_best 。

通过这段代码可以学到

  1. 如何有效地处理二维数组中的数据。
    • 例如通过两层循环遍历二维数组的每个元素。
  2. 运用 defaultdict 来根据特定的值组织数据。
    • 方便后续按照值的顺序进行处理。
  3. 结合排序和逐步更新的策略来解决复杂的最值问题。
    • 通过比较和更新 row_best 和 col_best 来获取最终的最大结果。

“千金纵买相如赋,脉脉此情谁诉。”——《摸鱼儿·更能消几番风雨》

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

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

相关文章

【学习DayNa】信息系统开发整理

✍🏻记录学习过程中的输出,坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞👍🏻收藏⭐评论✍🏻指点🙏 结构化方法 结构是指系统内各个组成要素之间的相互联系、相互作用的框架。结构化开发方法就是…

Java应用打包成Docker镜像

# 使用官方的OpenJDK17镜像作为基础镜像 FROM openjdk:17 # 设置工作目录 WORKDIR /app # 复制本地的Java应用程序文件到镜像中的指定目录 COPY target/bear-module-system-0.0.1-SNAPSHOT.jar /app/bear-module-system-0.0.1-SNAPSHOT.jar # 暴露API端口 EXPOSE 8888 …

shell中的流程控制

条件判断在流程控制中的重要性 有了条件判断才能进行if判断即分支流程,才能进行case的多分支流程,才能进行for循环和while循环。 单分支流程判断 如上图所示,在shell编程中常使用英文状态下的分号来在Linux控制台一次性执行多条命令&#x…

小米SU7遇冷,下一代全新车型被官方意外曝光

不知道大伙儿有没有发现,最近小米 SU7 热度好像突然之间就淡了不少? 作为小米首款车型,SU7 自上市以来一直承载着新能源轿车领域流量标杆这样一个存在。 发售 24 小时订单量破 8 万,2 个月后累计交付破 2 万台。 看得出来限制它…

运算放大器(运放)缓冲器(跟随器)电路

运算放大器(Operational Amplifier) 运算放大器(Operational Amplifier)是一种差分放大器,具有高输入电阻、低输出电阻、高开放增益(开环增益),并具有可放大输入引脚与-输入引脚间的电压差的功能。 设计目标 输入输入输出输出频…

“打卡展示”后遗症如何解决

最近看了一本书,里边提到的学习打卡,健身打卡,早期打卡,不管是在家里,在学校,上班族,都在抓紧一切时间提升自己,为了实现目标出现了形形色色的打卡,只要你能想得到的领域…

HTML李峋同款跳动的爱心代码(双爱心版)

目录 写在前面 跳动的爱心 完整代码 代码分析 系列推荐 最后想说 写在前面 在浩瀚的网络世界中,总有一些小惊喜能触动我们的心弦。今天,就让我们用HTML语言,探索既神秘又浪漫的李峋同款跳动的爱心代码吧。 首先,让我们一起…

基于Pytorch框架的深度学习Swin-Transformer神经网络食物分类系统源码

第一步:准备数据 5种鸟类数据:self.class_indict ["苹果派", "猪小排", "果仁蜜饼", "生牛肉薄片", "鞑靼牛肉"] ,总共有5000张图片,每个文件夹单独放一种数据 第二步&…

分布式锁(4):jedis基于Redis setnx、get、getset的分布式锁

1 实现原理 setnx(lockkey, 当前时间+过期超时时间) ,如果返回1,则获取锁成功;如果返回0则没有获取到锁,转向步骤(2)get(lockkey)获取值oldExpireTime ,并将这个value值与当前的系统时间进行比较,如果小于当前系统时间,则认为这个锁已经超时,可以允许别的请求重新获取,…

《多线程》

每一个任务就是一个进程,每个进程内部至少有一个线程在运行中。线程是程序执行的一个路径,每一个线程都有自己的局部变量表,程序技术器,以及各自的生命周期。 1.创建一个线程,并且重写它的run方法,将行为方…

swift使用swift-protobuf协议通讯,使用指北

什么是Protobuf Protobuf(Protocol Buffers)协议😉 Protobuf 是一种由 Google 开发的二进制序列化格式和相关的技术,它用于高效地序列化和反序列化结构化数据,通常用于网络通信、数据存储等场景。 为什么要使用Proto…

UnrealEngine打开Setup.bat,提示Failed to download的解决方法

Failed to download when I run Setup.bat - #3 by Milisours - Getting Started & Setup - Epic Developer Community Forums https://forums.unrealengine.com/uploads/short-url/oGTskBcZI8ACTyCw7jIK2dTmkC7.xml 下载这个文件 然后替换掉Engine/Build/下面的Commit.g…

c++ map set底层模拟实现

关于这两个数据结构的insert接口实现 请看这篇文章 https://blog.csdn.net/l23456789mmmmm/article/details/139500413?spm1001.2014.3001.5501 map::operator[]底层实现请看这篇文章 cmap类operator[]详解_c map operator-CSDN博客 红黑树模拟实现 #pragma once #include &…

Java面试八股之myBatis与myBatis plus的对比

myBatis与myBatis plus的对比 基础与增强: MyBatis 是一个成熟的Java持久层框架,它允许开发者通过XML文件或注解来配置SQL语句和数据库映射,提供了一个灵活的方式来操作数据库,但需要手动编写所有的SQL语句和结果集映射。 MyBa…

Day55 代码随想录打卡|二叉树篇---二叉搜索树中的插入操作

题目(leecode T701): 给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【11】ElasticSearch

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【11】ElasticSearch 简介基本概念ElasticSearch概念-倒排索引安装基本命令ik 分词器SpringBoot整合测试存储数据:测试复杂检索同步与异步调用 参考 简介 Elasticsearch 是一…

【AIGC】MetaGPT原理以及应用

目录 MetaGPT原理 MetaGPT应用 MetaGPT和传统编程语言相比有什么优势和劣势 视频中的PPT 参考资料 MetaGPT原理 MetaGPT是一种多智能体框架,它结合了元编程技术,通过标准化操作程序(SOPs)来协调基于大语言模型的多智能体系统…

Zookeeper 集群节点选举原理实现(三)

Zookeeper 集群节点选举原理实现(三) 刚部署三个节点或者多个节点启动时,此时还未选择出领导节点,不同节点的初始化zxid 是如何保证不重复不冲突有序呢? 在 Zookeeper 集群的初始启动阶段,所有节点会在选举领导节点之前先初始化自己的状态和 ZXID。为了确保不同节点的初始…

jieba中文分词器的使用

Jieba 是一个中文分词的第三方库,主要用于对中文文本进行分词。分词是将文本分割成一个个词语的过程,这在中文文本处理中尤为重要,因为中文不像英文那样有明显的空格来分隔词语。Jieba 的分词算法可以实现精确分词、全模式分词和搜索引擎模式…

嵌入式实验---实验一 通用GPIO实验

一、实验目的 1、掌握STM32F103 GPIO程序设计流程; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、通过按键实现:按键按下,LED点亮;按键释放,LED熄灭。 三、实验设备和器材 电脑、Keil uVision5软件、Proteus…