矩阵中严格递增的单元格数

题目链接:leetcode:矩阵中严格递增的单元格数
描述

给你一个下标从 1 开始、大小为 m x n 的整数矩阵 mat,你可以选择任一单元格作为 起始单元格 。
从起始单元格出发,你可以移动到 同一行或同一列 中的任何其他单元格,但前提是目标单元格的值 严格大于 当前单元格的值。
你可以多次重复这一过程,从一个单元格移动到另一个单元格,直到无法再进行任何移动。
请你找出从某个单元开始访问矩阵所能访问的 单元格的最大数量 。
返回一个表示可访问单元格最大数量的整数。


其中:
m == mat.length
n == mat[i].length
1 <= m, n <= 10^5
1 <= m * n <= 10^5
-10^5 <= mat[i][j] <= 10^5

输入

图
mat = [[3,1,6],[-9,5,7]]

输出

4

PS:之前有事漏做了ε=(´ο`*)))唉,今天补一下。

思路:
初看题目,位置(i, j),只能移动到同行或同列中值严格比他大的位置。因此可以将这个矩阵根据每个位置间的可到达性建立一张拓扑图,所求的得到最大单元格访问数量的路线,必然是从拓扑图中某一个入度为0的位置出发到某一个出度为0的位置结束。根据这个特性,我们可以从入度为0或者出度为0的位置出发来计算最大单元格访问数量。
在这里我采用了从出度为0出发的思路,个人感觉更“顺”一点。


设从位置(i , j)出发的最大单元格访问数为dp[i][j],(i, p)可表示所有同行中(i, j)可到达的位置,(q, j)可表示同列中(i , j)可到达的位置。那么dp[i][j] = max(max(dp[i][p]+1), max(dp[q][j]+1) ) 。从这里可以看出,要得到dp[i][j],我们要算出同行中所有的dp[i][p]和同列中所有的dp[q][j],所以我们要从拓扑图的右边往左边计算dp[i][j](最右边位置出度为0,dp[i][j] = 1)。

如果能顺利建图,那么问题就简单了,但是这里矩阵可能出现一维的情况,那么建图的复杂度就为O(n^2),对于n最大为1e5的情况显然会超时,所以还得优化思路。

不能建图,那就继续从小的只能往大的位置走这一特性入手,并从整体出发。只要我先计算了所有比位置(i, j)值大的位置的dp值,那么计算dp[i][j]所需的依赖——dp[i][p]和dp[q][j],都已经算好了。现在有了dp[i][p]和dp[q][j],就剩下max(dp[i][p])和max(dp[q][j])的计算。若每次都采用遍历的方法去计算max(dp[i][p])和max(dp[q][j]),总复杂度又回到了O(n^2),仍需优化。

以max(dp[i][p])的计算为例,若有两个位置(i, j0)和(i, j1), 且mat[i][j0] = mat[i][j1] + 1(只要mat[i][j1]是第i行中仅次于mat[i][j0]的值就行了),目前已知dp[i][j0],那么(i, j1)的max(dp[i][p]) = dp[i][j0] + 1。因此我们可建立两个数组,一个保存每行的最大dp值,一个保存每列的最大dp值。虽然我们是按mat值从大到小计算dp值,能保证不少算东西,但行或列中可能会存在相同的值,会多算东西。所以对于每行/每列的最大dp值需要存两个,一个存最大dp值一个存次大dp值,且取得两个值所在位置的mat值不能相同。这样就只需要在计算时比较一下mat[i][j]是否等于最大值所在mat值就行了,若不等于则选择最大dp值,反之选次大dp值。

struct node
{int val, x, y;bool operator < (const node &o)const{return val > o.val;}
};
struct dpnode
{int val_0, cnt_0;int val_1, cnt_1;void update(int val, int cnt){if(val == val_0){if(cnt > cnt_0){cnt_0 = cnt;}}else {if(cnt > cnt_0){cnt_1 = cnt_0;val_1 = val_0;cnt_0 = cnt;val_0 = val;}else if(cnt > cnt_1){cnt_1 = cnt;val_1 = val;}}}
};
const int inf = -1e5 - 5;
class Solution {
public:int maxIncreasingCells(vector<vector<int>>& mat) {int n = mat.size(), m = mat[0].size();vector<node> arr(n * m);dpnode demoe = (dpnode){inf, 0, inf, 0};vector<dpnode> row(n, demoe), col(m, demoe);for(int i = 0; i < n;i++){for(int j = 0;j < m;j++){arr[i*m+j] = (node){mat[i][j], i, j};}} sort(arr.begin(), arr.end());int ans=0;int tmp_row, tmp_col;for(int i = 0;i < arr.size();i++){if(row[arr[i].x].val_0 != arr[i].val){tmp_row = row[arr[i].x].cnt_0 + 1;}else tmp_row = row[arr[i].x].cnt_1 + 1;if(col[arr[i].y].val_0 != arr[i].val){tmp_col =  col[arr[i].y].cnt_0 + 1;}else tmp_col = col[arr[i].y].cnt_1 + 1;if(tmp_col > tmp_row) tmp_row = tmp_col;row[arr[i].x].update(arr[i].val, tmp_row);col[arr[i].y].update(arr[i].val, tmp_row);}for(int i = 0;i < n;i++){ans = max(ans, row[i].cnt_0);}for(int j = 0;j < m;j++){ans = max(ans, col[j].cnt_0);}return ans;}
}; 

若有什么错误,欢迎指正^ _ ^ 。

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

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

相关文章

【JavaEE进阶】Spring统一功能处理:拦截器的使用

目录 1.什么是拦截器? 2.拦截器的使用 2.1定义拦截器 2.2 注册配置拦截器 3.拦截器详解 3.1 拦截路径 3.2 拦截器的执行流程 4. 使用拦截器实现登录校验 4.1 定义拦截器 4.2 注册配置拦截器 1.什么是拦截器? 拦截器是Spring框架提供的核心功能之⼀, 主要用来拦截用…

AI赋能前端:你的Chrome 控制台需要AI(爱)

像会永生那样去学习,像明天就要死亡那样去生活。——圣雄甘地 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 AI(Gemini)ChromeDevTool🪜魔法接码平台因为,行文字数所限,有些概念可能会一带而过亦或者提供对应的学习…

[【机器学习】深度概率模型(DPM)原理和文本分类实践

1.引言 1.1.DPM模型简介 深度概率模型&#xff08;Deep Probabilistic Models&#xff09; 是结合了深度学习和概率论的一类模型。这类模型通过使用深度学习架构&#xff08;如神经网络&#xff09;来构建复杂的概率分布&#xff0c;从而能够处理不确定性并进行预测。深度概率…

刘亦菲新剧玫瑰的故事

刘亦菲新剧《玫瑰的故事》&#xff1a;开放结局&#xff0c;无限遐想 当刘亦菲再次踏入荧屏&#xff0c;与导演汪俊携手打造的《玫瑰的故事》便引发了无数观众的期待与关注。这部剧不仅汇聚了众多实力派演员&#xff0c;更以其独特的剧情和精致的制作成为了近期热门的话题。《…

网络编程(TCP协议,UDP协议)

目录 网络编程三要素 IP IPv4 InetAddress类 端口号 协议 UDP协议 UDP协议发送数据 UDP协议接收数据 UDP的三种通信方式(代码实现) TCP协议 TCP通信程序 三次握手和四次挥手 练习 1、客户端:多次发送数据服务器:接收多次接收数据&#xff0c;并打印 2、客户端…

cad批量打印pdf怎么弄?介绍三种打印方法

cad批量打印pdf怎么弄&#xff1f;在CAD设计领域&#xff0c;批量打印PDF文件是一项常见且至关重要的任务。面对大量的CAD图纸&#xff0c;如何高效地进行转换和打印&#xff0c;成为了设计师们亟待解决的问题。今天&#xff0c;我们就来推荐三款能够批量打印PDF的CAD软件&…

最新扣子(Coze)实战案例:扣子卡片的制作及使用,完全免费教程

&#x1f9d9;‍♂️ 大家好&#xff0c;我是斜杠君&#xff0c;手把手教你搭建扣子AI应用。 &#x1f4dc; 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》&#xff0c;完全免费学习。 &#x1f440; 关注斜杠君&#xff0c;可获取完整版教程。&#x1f44d;&#x1f3f…

对红酒数据集,分别采用决策树算法和随机森林算法进行分类。

1.导入所需要的包 from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split 2.导入数据&#xff0c;并且对随机森林和决策数进…

后端程序员的Linux命令指南

后端程序员的终极命令指南&#xff1a;考考自己是不是真正掌握Linux的使用 欢迎各位穿着格子衬衫&#xff0c;常年抱着键盘睡觉的后端小伙伴们&#x1f44b;&#x1f44b;&#x1f44b;&#xff01;今天&#xff0c;考考你们是不是掌握以下让你们在日后在服务器上叱咤风云的命令…

关于微信小程序取消获取用户昵称的一些思考

官方说明&#xff0c;有部分小程序乱用授权&#xff0c;强迫用户提交头像和昵称。 核心是微信担心用户信息被滥用。 其一 &#xff0c;微信头像经常是本人真是照片&#xff0c;在现在人工智能算法的加持下&#xff0c;人脸数据太容易被套取。 其二&#xff0c;微信名称同理&…

CVPR 2024第三弹:小编与李飞飞教授惊喜同框,CVPR之家乐队火爆演奏惊艳全场

CVPR 2024第三弹&#xff1a;小编与李飞飞教授惊喜同框&#xff0c;"CVPR之家"乐队火爆演奏惊艳全场&#xff01; 会议之眼 快讯 2024 年 CVPR &#xff08;Computer Vision and Pattern Recogntion Conference) 即国际计算机视觉与模式识别会议&#xff0c;于6月1…

最新评测:2024年13款国内外缺陷跟踪管理工具(含免费/开源)

文章中介横向对比了11款主流缺陷管理工具&#xff1a;1. PingCode&#xff1b;2. Worktile&#xff1b;3. Jira&#xff1b;4. ZenTao&#xff08;禅道&#xff09;&#xff1b;5. Bugzilla&#xff1b;6. Redmine&#xff1b;7. Tapd&#xff1b;8. MantisBT&#xff1b;9. Tr…

AttributeError: ‘ImageDraw‘ object has no attribute ‘textsize‘

python项目生成词云图的时候报错&#xff1a;AttributeError: ‘ImageDraw’ object has no attribute ‘textsize’ 解决办法 出现这个问题&#xff0c;可能是因为Pillow版本过高导致的&#xff0c;我们可以尝试通过降低Pillow的版本来解决它。 我通过将Pillow版本降低到9.4.…

贴图法美化Button按钮

贴图法美化Button按钮 项目是在下面这篇文章里的基础上进行美化的&#xff1a;MFC实现INI配置文件的读取 1. 初始效果 2.最终效果 3. 增加 CImgButton 类 1.1 ImgButton.h 头文件 #pragma once // CImgButtonclass CImgButton : public CBitmapButton {DECLARE_DYNAMIC(CImgBu…

游戏本地化以拓展海外市场

Logrus IT Korea的总监元庆燕&#xff08;KyoungYeon Won&#xff09;发表了一场关于“游戏本地化”的讲座&#xff0c;讲述了独立游戏开发者如何在梦想拓展海外市场的过程中&#xff0c;正确地本地化他们的游戏以满足国际市场的期望&#xff0c;以及实现这一重要任务的过程。 …

注解详解系列 - @ResponseStatus

注解简介 在今天的每日一注解中&#xff0c;我们将探讨ResponseStatus注解。ResponseStatus是Spring框架中的一个注解&#xff0c;用于为控制器方法指定HTTP响应状态码和理由短语。 注解定义 ResponseStatus注解用于标记控制器方法或异常类&#xff0c;以指示HTTP响应的状态码…

webpack 压缩图片

压缩前&#xff1a; 压缩后&#xff1a; 压缩后基本上是压缩了70-80%左右 1.依赖版本及配置 "imagemin-webpack-plugin": "^2.4.2", "imagemin-mozjpeg": "^7.0.0", "imagemin-pngquant": "^5.0.1", "webpa…

定个小目标之刷LeetCode热题(26)

这道题属于一道简单题&#xff0c;可以使用辅助栈法&#xff0c;代码如下所示 class Solution {public boolean isValid(String s) {if (s.isEmpty())return false;// 创建字符栈Stack<Character> stack new Stack<Character>();// 遍历字符串数组for (char c : …

项目3:从0开始的RPC框架(扩展版)-2

六. 自定义协议 1. 需求分析 在目前的RPC框架中&#xff0c;采用Vert.x的HttpServer作为服务提供者的Web服务器&#xff0c;底层使用HTTP协议进行网络传输。但HTTP协议只是RPC框架网络传输的一种可选方式&#xff0c;还有其它更好的选择。 RPC框架注重性能&#xff0c;但HTT…

基于组件的架构:现代软件开发的基石

目录 前言1. 基于组件的架构概述1.1 什么是组件&#xff1f;1.2 组件的分类 2. 基于组件的架构的优势2.1 提高代码的可重用性2.2 增强系统的灵活性2.3 简化维护和升级2.4 促进团队协作 3. 实现基于组件的架构3.1 识别和定义组件3.2 设计组件接口3.3 组件的开发和测试3.4 组件的…