当前位置: 首页 > news >正文

千问 LeetCode 2713. 矩阵中严格递增的单元格数 Java实现

这是一道经典的动态规划(DP)结合排序的题目。

题目核心思路

题目要求从任意单元格出发,每次只能移动到同一行或同一列中值严格大于当前单元格的格子,求能访问的最大单元格数量。

1. 动态规划状态定义:
我们可以定义 dp[i][j] 为以 (i, j) 单元格作为路径终点时,能访问的最大单元格数量。
状态转移方程为:dp[i][j] = max(第i行的最大路径长度, 第j列的最大路径长度) + 1。

2. 排序保证严格递增:
为了保证转移的正确性(即从小值转移到大值),我们需要将矩阵中的所有单元格按照数值从小到大进行排序。这样在遍历时,当前处理的单元格一定是由之前数值更小的单元格转移而来的。

3. 空间优化:
我们不需要维护完整的二维 dp 数组。只需要维护两个一维数组:
* rowMax[i]:记录第 i 行目前能达到的最大路径长度。
* colMax[j]:记录第 j 列目前能达到的最大路径长度。

4. 处理相同数值的细节(关键点):
题目要求“严格递增”,因此数值相同的单元格之间不能互相转移。如果我们在遍历同一批相同数值的单元格时,算出一个结果就立刻更新 rowMax 和 colMax,会导致同批次的其他单元格错误地利用这个更新后的值。
解决方法:对于相同数值的所有单元格,先统一计算出它们的结果并暂存起来,等这一批全部算完后,再统一去更新 rowMax 和 colMax。

Java 实现代码

import java.util.*;

class Solution {
public int maxIncreasingCells(int[][] mat) {
int m = mat.length;
int n = mat[0].length;

// 1. 使用 TreeMap 将矩阵中的值按从小到大排序,并存储对应的坐标
// Key: 单元格的值, Value: 具有该值的所有单元格坐标列表
Map<Integer, List<int[]>> map = new TreeMap<>();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
map.computeIfAbsent(mat[i][j], k -> new ArrayList<>()).add(new int[]{i, j});
}
}

// rowMax[i] 表示第 i 行目前能达到的最大递增单元格数
int[] rowMax = new int[m];
// colMax[j] 表示第 j 列目前能达到的最大递增单元格数
int[] colMax = new int[n];

int result = 0;

// 2. 按值从小到大遍历
for (List<int[]> cells : map.values()) {
// 暂存当前这一批相同数值的单元格计算出的结果
List<Integer> tempResults = new ArrayList<>();

// 第一遍遍历:计算当前批次每个单元格的最大递增长度
for (int[] cell : cells) {
int r = cell[0];
int c = cell[1];
// 当前单元格的最大长度 = 该行或该列之前的最大长度 + 1
tempResults.add(Math.max(rowMax[r], colMax[c]) + 1);
}

// 第二遍遍历:统一更新 rowMax 和 colMax,防止同值单元格互相影响
for (int i = 0; i < cells.size(); i++) {
int r = cells.get(i)[0];
int c = cells.get(i)[1];
int currentMax = tempResults.get(i);

rowMax[r] = Math.max(rowMax[r], currentMax);
colMax[c] = Math.max(colMax[c], currentMax);

// 更新全局最大值
result = Math.max(result, currentMax);
}
}

return result;
}
}

复杂度分析
* 时间复杂度:O(mn log(mn))。其中 m 和 n 是矩阵的行数和列数。主要耗时在将所有 m*n 个元素放入 TreeMap(或排序)的过程中。后续的双层遍历总次数也是 m*n。
* 空间复杂度:O(mn)。主要用于存储 TreeMap 中的坐标映射以及暂存相同数值计算结果的列表。

http://www.cnnetsun.cn/news/2595706.html

相关文章:

  • 终极Mac清理指南:Pearcleaner彻底卸载应用并释放存储空间
  • 设备可靠性分析入门:用威布尔分布预测你的服务器硬盘还能撑多久
  • 告别环境配置烦恼:用Shell脚本一键部署Synopsys VCS 2018 + Verdi + SCL
  • 华为防火墙USG6309E开局实战:从零构建安全网络通道
  • ABAQUS进阶实战:复杂结构六面体网格高效剖分策略
  • 创业团队如何进行技术规划
  • LizzieYzy:免费开源的围棋AI分析助手,打造你的职业级围棋教练
  • 跟我学UDS(ISO14229) ———— 0x36(TransferData)的实战解析与容错机制
  • Logisim门电路实战指南:从真值表到复杂逻辑构建
  • Spring Cloud 详解(一篇文章带你玩转各种技术)
  • 终极指南:如何免费解锁《艾尔登法环》帧率限制,畅享高帧率游戏体验
  • 英雄联盟终极智能助手:League Akari 完全使用指南
  • 如何快速掌握MoveIt2:面向初学者的完整ROS 2运动规划框架指南
  • 避开这些坑!ADNI数据预处理前必须搞懂的文档:DocumentSummary.csv与ARM.csv详解
  • 【GNN图神经网络】从聚类系数看社交网络中的“小圈子”效应
  • FModel:虚幻引擎游戏资源逆向工程与资产提取技术深度解析
  • 从`<svg>`到`<use>`:解锁HTML中SVG图标系统的完整工作流
  • libaom 源码分析:运动搜索过程和 pattern_search 函数
  • 对比按量计费与Token Plan在Taotoken平台的实际支出感受
  • 别再只用TrailRenderer了!用Unity的LineRenderer实现更丝滑的切水果刀痕(附完整C#脚本)
  • 鸣潮自动化实战指南:基于图像识别的智能辅助工具深度解析
  • 如何快速掌握Nginx配置文件格式化:面向开发者的完整指南
  • 突破百度网盘限速:基于Python的下载链接解析技术方案
  • 免费文档下载终极方案:解锁百度文库、道客巴巴等30+平台限制
  • JSON操作封装
  • 自托管AI智能体框架TALOS:本地部署、自定义工具与安全实践指南
  • 图片去水印用什么工具好用|2026 免费图片去水印工具推荐与实测对比
  • 2026 图片去水印工具推荐|免费图片去水印工具实测有哪些好用的
  • F411-WeAct实战:IIC驱动SSD1306 OLED显示模块(0.96寸)
  • DrBERT-7GB:革命性法语生物医学AI模型,7GB医学数据预训练完全指南 [特殊字符]