【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数

本文涉及的基础知识点

二分查找算法合集

题目

给你一个下标从 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 。
参数范围
m == mat.length
n == mat[i].length
1 <= m, n <= 105
1 <= m * n <= 105
-105 <= mat[i][j] <= 105

分析

时间复杂度: O(mnlogmn)。初始化数据时间复杂度:O(nmlogmn)。枚举所有单元格时间复杂度O(mn),处理每个单元格,时间复杂度O(n)。

变量解析

mValueToRowCols各值对应的行列,按值降序排序
vRowMax大于当前值的各行最大递增单元格数
vColMax大于当前值的各列最大递增单元格数
vBuf当前值各行列的最大递增单元格数

代码

class Solution {
public:int maxIncreasingCells(vector<vector<int>>& mat) {m_r = mat.size();m_c = mat.front().size();std::map<int, vector<pair<int, int>>,greater<int>> mValueToRowCols;for (int r = 0; r < m_r ;r++){for (int c = 0; c < m_c ; c++){mValueToRowCols[mat[r][c]].emplace_back(r, c);}}vector<int> vRowMax(m_r), vColMax(m_c);vector<tuple<int, int, int>> vBuf;for (const auto& [tmp, v] : mValueToRowCols){			for (const auto& [r, c] : v){const int iMax = max(vRowMax[r], vColMax[c]) + 1;vBuf.emplace_back(r, c, iMax);				}for (const auto& [r, c, iMax] : vBuf){vRowMax[r] = max(vRowMax[r], iMax);vColMax[c] = max(vColMax[c], iMax);}vBuf.clear();}return *std::max_element(vRowMax.begin(), vRowMax.end());}int m_r, m_c;
};

测试用例

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){assert(v1[i] == v2[i]);}
}template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}int main()
{vector<vector<int>> mat;{Solution slu;mat = { {3,1},{3,4} };auto res = slu.maxIncreasingCells(mat);Assert(2, res);}{Solution slu;mat = { {1,1},{1,1} };auto res = slu.maxIncreasingCells(mat);Assert(1, res);}{Solution slu;mat = mat = { {3,1,6},{-9,5,7} };auto res = slu.maxIncreasingCells(mat);Assert(4, res);}{Solution slu;mat = mat = { {5, 2, 9},{-6, 2, -5},{-1, 0, -5} };auto res = slu.maxIncreasingCells(mat);Assert(6, res);}
}

超时代码示例

vector<int> vRowMax(m_r), vColMax(m_c);for (const auto& [tmp, v] : mValueToRowCols){vector<int> vCurRowMax = vRowMax, vCurColMax = vColMax;for (const auto& [r, c] : v){const int iMax = max(vRowMax[r], vColMax[c]) + 1;vCurRowMax[r]= max(vCurRowMax[r],iMax);vCurColMax[c] = max(vCurColMax[r],iMax);}vCurRowMax.swap(vRowMax);vCurColMax.swap(vColMax);}

vector 构造函数比较费事,执行mn次会超时。

2023年6月旧代码

class Solution {
public:
int maxIncreasingCells(vector<vector>& mat)
{
m_r = mat.size();
m_c = mat[0].size();
std::map < int, vector<pair<int, int>>,std::greater> mValueRowCol;
for (int r = 0; r < m_r; r++)
{
for (int c = 0; c < m_c; c++)
{
mValueRowCol[mat[r][c]].emplace_back(make_pair( r, c ));
}
}
vector vPreRows(m_r, 0), vPreCols(m_c, 0);
int iMaxRet = 0;
std::queue<std::tuple<int, int, int> > que;
for ( auto it : mValueRowCol)
{
for (const auto& pr : it.second)
{
int iRet = std::max(vPreRows[pr.first],vPreCols[pr.second])+1 ;
iMaxRet = max(iMaxRet, iRet);
que.emplace(pr.first, pr.second, iRet);
}
while (que.size())
{
const int r = get<0>(que.front());
const int c = get<1>(que.front());
const int iRet = get<2>(que.front());
que.pop();
vPreRows[r] = max(vPreRows[r] ,iRet);
vPreCols[c] = max(vPreCols[c],iRet);
}
}

	return iMaxRet;
}
int m_r, m_c;

};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关

下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

2-2基础算法-递归/进制转换

文章目录 一.递归二.进制转换 一.递归 1.数的计算 评测系统 #include <iostream> int countCombinations(int n) { //计算当然组合种数if (n 1) {return 1;}int count 1;//数字本身就是一个有效组合for (int i 1; i < n / 2; i) {count countCombinations(i);/…

【51单片机系列】proteus中创建16x16LED点阵

本文参考来源&#xff1a; Proteus8.6中16x16LED点阵制作教程【Proteus】16乘16点阵滚动播放 文章目录 一、测试proteus中的8x8点阵驱动方式1.1 测试电流通过方向1.2 测试行列控制接口 二、使用proteus中的8x8点阵制作16x16LED点阵三、测试制作的16x16LED点阵四、使用自制的16x…

【Hive】

一、Hive是什么 Hive是一款建立在Hadoop之上的开源数据仓库系统&#xff0c;将Hadoop文件中的结构化、半结构化数据文件映射成一张数据库表&#xff0c;同时提供了一种类SQL语言&#xff08;HQL&#xff09;&#xff0c;用于访问和分析存在Hadoop中的大型数据集。Hive的核心是将…

Collecting Application Engine Performance Data 收集应用程序引擎性能数据

You can collect performance data of any specific SQL action of an Application Engine program to address any performance issue. 您可以收集应用程序引擎程序的任何特定SQL操作的性能数据&#xff0c;以解决任何性能问题。 You can collect performance data of the S…

LeetCode 每日一题 Day 11||贪心

2697. 字典序最小回文串 给你一个由 小写英文字母 组成的字符串 s &#xff0c;你可以对其执行一些操作。在一步操作中&#xff0c;你可以用其他小写英文字母 替换 s 中的一个字符。 请你执行 尽可能少的操作 &#xff0c;使 s 变成一个 回文串 。如果执行 最少 操作次数的方…

【虹科分享】基于Redis Enterprise,LangChain,OpenAI 构建一个电子商务聊天机器人

如何构建你自己的商务聊天机器人&#xff1f;注意哦&#xff0c;是你自己的聊天机器人。一起来看看Redis Enterprise的向量检索是怎么帮你实现这个愿望的吧。 鉴于最近人工智能支持的API和网络开发工具的激增&#xff0c;似乎每个人都在将聊天机器人集成到他们的应用程序中。 …

HAProxy 根据报文解析来定义不同的acl

1 .在 HAProxy 中使用 ACLs&#xff08;Access Control Lists&#xff09;检查 TCP 报文内容时&#xff0c;你可以使用 payload 关键字。以下是一个例子&#xff0c;演示如何在 HAProxy 的 ACL 中使用 payload&#xff1a; frontend my_frontendbind *:80mode tcpacl payload_h…

原生cesium、mars3d、supermap-cesium在vue3+vite中引入

1. 原生cesium 需要下载 yarn add cesiumyarn add vite-plugin-cesium2. mars3d 需要下载 yarn add mars3d mars3d-cesiumyarn add vite-plugin-mars3d3. supermap-cesium 只需要引入官网下载的包&#xff0c;build文件夹下的cesium&#xff0c;以及项目中引入的其他cesiu…

【深度学习】PHP操作mysql数据库总结

一.PHP数据库的扩展分类 1.MySQL 扩展是针对 MySQL 4.1.3 或更早版本设计的&#xff0c;是 PHP 与 MySQL数据库交互的早期扩展。由于其不支持 MySQL 数据库服务器的新特性&#xff0c;且安全性差&#xff0c;在项目开发中不建议使用&#xff0c;可用 MySQLi 扩展代替。 2.MySQ…

Android BottomSheetBehavior(底部弹窗)

目录 一、BottomSheetBehavior 介绍 二、BottomSheetBehavior 基本使用 2.1 在 CoordinatorLayout 中添加底部工作表&#xff1a; 2.2 在代码中获取 BottomSheetBehavior 实例&#xff1a; 2.3 设置工作表的状态&#xff0c;如展开、折叠等 2.4 工作表的状态 三、Bottom…

嵌入式系统未来的发展趋势走向???

人工智能和机器学习应用 模型优化&#xff1a; 为了在资源有限的嵌入式系统上运行&#xff0c;将会看到更多的努力投入到精简、优化和量化模型&#xff0c;以适应边缘计算的环境。 边缘推理&#xff1a; 嵌入式设备将更多地执行本地推理&#xff0c;而不是将所有数据发送到云端…

Android原生 MQTT开发

一、引包 1.1.模块的build.gradle //mqtt框架implementation org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0implementation org.eclipse.paho:org.eclipse.paho.android.service:1.1.1implementation org.bouncycastle:bcpkix-jdk15on:1.59 1.2 旧版AndroidStudio开…

【设计模式--行为型--命令模式】

设计模式--行为型--命令模式 命令模式定义结构案例优缺点使用场景 命令模式 定义 将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行存储&#xff0c;传递&#xff0c;调用…

Springboot整合Redis实现消息发布订阅

一、前言 有时候在实际项目中&#xff0c;某些业务场景下我们需要使用消息的发布订阅功能&#xff0c;以实现某些特殊的需求&#xff0c;那么我们实际上可以有多种选择&#xff0c;比如使用常见的消息中间件Rabbitmq&#xff0c;Kafka&#xff0c;Activemq等&#xff0c;但这几…

Nodejs 第二十四章(zlib)

在 Node.js 中&#xff0c;zlib 模块提供了对数据压缩和解压缩的功能&#xff0c;以便在应用程序中减少数据的传输大小和提高性能。该模块支持多种压缩算法&#xff0c;包括 Deflate、Gzip 和 Raw Deflate。 zlib 模块的主要作用如下&#xff1a; 数据压缩&#xff1a;使用 z…

07--面向对象OOP--02

学习面向对象内容的三条主线 Java类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类面向对象的特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09;其他关键字的使用&#xff1a;…

城轨线路列车时刻表与车站客流控制协同优化方法

文章信息 论文题目为《城轨线路列车时刻表与车站客流控制协同优化方法》&#xff0c;该文于2021年发表于《交通运输系统工程与信息》上。文章考虑换入客流影响下列车时刻表与客流控制的协同优化问题&#xff0c;以最小化乘车延误人数为目标&#xff0c;以列车时刻表、客流控制和…

前端成神之路-CSS基础选择器

前端成神之路-CSS基础选择器 目录 前端成神之路-CSS基础选择器 CSS选择器&#xff08;重点&#xff09; 1. CSS选择器作用&#xff08;重点&#xff09; 选择器的作用 2. CSS基础选择器 2.1 标签选择器 2.2 类选择器 2.3 类选择器特殊用法- 多类名 2.4 id选择器 id选…

java代码编写twitter授权登录

在上一篇内容已经介绍了怎么申请twitter开放的API接口。 下面介绍怎么通过twitter提供的API&#xff0c;进行授权登录功能。 开发者页面设置 首先在开发者页面开启“用户认证设置”&#xff0c;点击edit进行信息编辑。 我的授权登录是个网页&#xff0c;并且只需要进行简单的…

动物姿态估计:微调 YOLOv8 姿态模型

动物姿态估计是计算机视觉的一个研究领域&#xff0c;是人工智能的一个子领域&#xff0c;专注于自动检测和分析图像或视频片段中动物的姿势和位置。目标是确定一种或多种动物的身体部位&#xff08;例如头部、四肢和尾巴&#xff09;的空间排列。这项技术具有广泛的应用&#…