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

DeepSeek LeetCode 3989. 网格中保持一致的最大列数 Java实现

题目简述

3989. 网格中保持一致的最大列数:给定一个 m x n 的二维整数数组 grid 和一个整数 limit。你可以删除任意数量(至少保留一列)的列,剩余列保持原有相对顺序。如果对于每一行中的任意相邻保留列 a 和 b(a < b),都有 |grid[i][b] - grid[i][a]| <= limit,则称该网格是 一致 的。返回可以保留的最大列数。

约束:m, n ≤ 250,允许 O(n²·m) 的 DP 解法。

---

核心思路:最长上升子序列 (LIS) 变种

关键转化:选择保留的列,必须满足任意两列之间(不只是相邻)在所有行上的差值都不超过 limit。但由于差值满足三角不等式,只要相邻保留列满足条件,所有列之间都满足条件。

因此问题转化为:在 n 列中,选择一个最长子序列,使得子序列中任意相邻两列 c1 < c2,对每一行 i 都有 |grid[i][c2] - grid[i][c1]| <= limit。

DP 定义:

· dp[j] = 以第 j 列结尾的最长保留列数
· 初始值 dp[j] = 1(单独保留一列)
· 转移:dp[j] = max(dp[j], dp[i] + 1),其中 i < j 且第 i 列和第 j 列兼容(所有行的差值 ≤ limit)

答案:max(dp),因为不要求以某一列结尾。

---

Java 实现

```java
class Solution {
public int maxConsistentColumns(int[][] grid, int limit) {
int m = grid.length;
int n = grid[0].length;

// dp[j] = 以第 j 列结尾的最长保留列数
int[] dp = new int[n];
int ans = 1;

for (int j = 0; j < n; j++) {
dp[j] = 1; // 只保留第 j 列本身
for (int i = 0; i < j; i++) {
if (canPlace(grid, i, j, limit)) {
dp[j] = Math.max(dp[j], dp[i] + 1);
}
}
ans = Math.max(ans, dp[j]);
}

return ans;
}

// 检查第 i 列和第 j 列是否兼容(所有行的差值 ≤ limit)
private boolean canPlace(int[][] grid, int i, int j, int limit) {
for (int[] row : grid) {
if (Math.abs(row[j] - row[i]) > limit) {
return false;
}
}
return true;
}
}
```

---

复杂度分析

指标 复杂度
时间复杂度 O(n²·m),n, m ≤ 250,约 1560 万次操作,可接受
空间复杂度 O(n),仅需一维 DP 数组

---

示例验证

示例 1:grid = [[-2,0,3]], limit = 2

· 列 0 和列 1:|0 - (-2)| = 2 ≤ 2 ✅
· 列 1 和列 2:|3 - 0| = 3 > 2 ❌
· 列 0 和列 2:|3 - (-2)| = 5 > 2 ❌
· 最优:保留列 0、1 → 答案 2

示例 2:grid = [[1,-1,1],[2,2,2]], limit = 1

· 列 0 和列 2:行0差 0,行1差 0 ✅
· 最优:保留列 0、2 → 答案 2

示例 3:grid = [[-5,5]], limit = 9

· 两列差值 10 > 9,只能保留一列 → 答案 1

http://www.jsqmd.com/news/1305795/

相关文章:

  • Rust并发编程中的所有权挑战与解决方案:从实际项目看Clone策略的应用
  • 【7. 实现登录注册模块】:实现会话管理、注册/登录/退出 API
  • Chrome文本批量替换终极指南:3分钟完成网页高效编辑的免费神器
  • Allegro PCB设计效率提升:env文件配置全解析与快捷键定制指南
  • 国内侧压门厂报价哪家低:严选 - 品牌推广大师
  • TMP102数字温度传感器:从I2C接口原理到嵌入式测温实战
  • 游戏引擎矩阵乘法优化:SIMD与转置技术实战
  • 做小程序的公司有哪些?2026四类服务商与项目适配分析
  • ai免费写论文可行吗?实测3款一键生成论文工具,结果有高有低!
  • 架构设计文档撰写指南:从沟通工具到工程蓝图的核心要素与实践
  • 2026年alloy49源头厂家用户力荐,质量参考评选 - mypinpai
  • Spring Boot Admin实战:5分钟搭建微服务统一监控中心
  • 7月运维技术学习路线复盘:从Kubernetes内核到分布式存储的系统性知识结构构建
  • RS-485 设备上云,三种方案的差距比你想象的大——KC25x 技术选型深度解析
  • 2026南京下水道疏通维修靠谱机构榜单 马桶地漏积水反臭倒灌彻底解决攻略 - 宅安选房屋修缮
  • 亲测无人机侦测肩灯,实际使用效果到底怎么样?
  • UE5 C++游戏开发入门:从环境搭建到角色交互实战
  • 学术规范与在线考试:从技术机制到诚信备考的深度解析
  • 分布式电源接入的三相不平衡潮流计算实现
  • 硅藻无机矿物板厂家:核心技术参数与应用价值详解(2026版) - 汇聚至此
  • 2026实力之选:高温合金圆棒现货供应商用户力荐 - mypinpai
  • 刷了100份简历,面试了50个校招生,我想对测试开发的应届生说点真心话
  • 英雄联盟玩家终极指南:如何用League Akari打造全自动游戏体验
  • 消费级五轴CNC:桌面制造新革命,如何将工业能力带入创客空间
  • 武汉榕霖职业技术学校有哪些专业?2026 招生简章及咨询电话 - 武汉中职最新信息发布
  • COCO数据集下载与使用全攻略:从获取到实战应用
  • Pandas日期差计算全解析:从Timestamp到Timedelta的实战指南
  • C++ Proxy模式:实现高性能类型擦除与新一代多态编程
  • 2026西安下水道疏通维修靠谱机构榜单 马桶地漏积水反臭倒灌彻底解决攻略 - 宅安选房屋修缮
  • ChatGPT语音功能技术解析:从ASR到TTS的完整实现与应用