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

DeepSeek LeetCode 2617. 网格图中最少访问的格子数 TypeScript实现

以下是 LeetCode 2617「网格图中最少访问的格子数」的 TypeScript 实现,采用 BFS + 并查集(路径压缩) 优化,保证每个格子只被访问一次,时间复杂度 O(mn·α(mn)),空间复杂度 O(mn)。

```typescript
function minimumVisitedCells(grid: number[][]): number {
const m = grid.length, n = grid[0].length;
if (m === 1 && n === 1) return 1;

// 距离数组,-1 表示未访问
const dist: number[][] = Array.from({ length: m }, () => new Array(n).fill(-1));
dist[0][0] = 1;

// 行并查集:rowParent[i][j] 表示在第 i 行中,列 j 及之后下一个未访问的列
const rowParent: number[][] = Array.from({ length: m }, () => new Array(n + 1).fill(0));
// 列并查集:colParent[j][i] 表示在第 j 列中,行 i 及之后下一个未访问的行
const colParent: number[][] = Array.from({ length: n }, () => new Array(m + 1).fill(0));

// 初始化并查集,每个位置指向自身
for (let i = 0; i < m; i++) {
for (let j = 0; j <= n; j++) rowParent[i][j] = j;
}
for (let j = 0; j < n; j++) {
for (let i = 0; i <= m; i++) colParent[j][i] = i;
}

// 查找 + 路径压缩
const findRow = (i: number, j: number): number => {
if (rowParent[i][j] !== j) {
rowParent[i][j] = findRow(i, rowParent[i][j]);
}
return rowParent[i][j];
};
const findCol = (j: number, i: number): number => {
if (colParent[j][i] !== i) {
colParent[j][i] = findCol(j, colParent[j][i]);
}
return colParent[j][i];
};

// 标记某格子已被访问(从并查集中移除)
const unionRow = (i: number, j: number) => {
rowParent[i][j] = findRow(i, j + 1);
};
const unionCol = (j: number, i: number) => {
colParent[j][i] = findCol(j, i + 1);
};

// 起点标记为已使用
unionRow(0, 0);
unionCol(0, 0);

const queue: [number, number][] = [[0, 0]];

while (queue.length) {
const [i, j] = queue.shift()!;
const step = dist[i][j];
const maxRight = Math.min(n - 1, j + grid[i][j]);
const maxDown = Math.min(m - 1, i + grid[i][j]);

// 向右移动(同一行)
let col = findRow(i, j + 1);
while (col <= maxRight) {
dist[i][col] = step + 1;
if (i === m - 1 && col === n - 1) return dist[i][col];
queue.push([i, col]);
unionRow(i, col);
unionCol(col, i);
col = findRow(i, col + 1);
}

// 向下移动(同一列)
let row = findCol(j, i + 1);
while (row <= maxDown) {
dist[row][j] = step + 1;
if (row === m - 1 && j === n - 1) return dist[row][j];
queue.push([row, j]);
unionRow(row, j);
unionCol(j, row);
row = findCol(j, row + 1);
}
}

return dist[m - 1][n - 1];
}
```

核心思路

· BFS 层次遍历:每次移动代价为 1,首次到达 (m-1, n-1) 时即为最少步数。
· 并查集跳过已访问格子:
· 对每一行维护一个并查集 rowParent,指向下一个未访问的列。
· 对每一列维护一个并查集 colParent,指向下一个未访问的行。
· 查找操作 findRow / findCol 配合路径压缩,能快速跳过已被访问的格子。
· 双向标记:当一个格子 (r, c) 被访问后,同时从行并查集和列并查集中移除,确保不会被重复处理。

复杂度分析

· 时间复杂度:O(mn·α(mn)),其中 α 为阿克曼反函数,近似常数。每个格子最多被访问一次,并查集操作几乎为常数。
· 空间复杂度:O(mn),用于存储距离数组、两个并查集以及 BFS 队列。

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

相关文章:

  • 上位机使用篇---Jetson的烧写和备份
  • java类继承理解
  • 全球首份Gemini代码生成「生产就绪度」白皮书(含27项SRE级验收标准+自动化检测脚本开源)
  • 黑白电视的“单眼魔法“:揭秘那个只用亮度讲故事的奇妙世界
  • 贝叶斯网络基本概念 CS188 Note12 学习笔记
  • 矩阵补全因果推断:破解贸易政策评估中的内生性与异质性难题
  • 亮度与色度:揭秘视觉世界的“双重密码“
  • DeepSeek-R1在火山引擎部署的7大避坑指南:从环境配置到GPU显存优化,一线工程师亲授
  • 2025-2026年国内人力资源外包公司推荐:TOP5评测价格注意事项适用场景案例 - 品牌推荐
  • 深度学习篇---张量
  • 贝叶斯网络中条件独立性的判断 CS188 Note13 学习笔记
  • 哪家工程信息平台专业?2026年5月推荐TOP5评测数据覆盖广防漏单特点选择指南 - 品牌推荐
  • 2026年5月郑州轴承专业服务商盘点:河南瓦房店轴承销售有限公司实力解析 - 2026年企业推荐榜
  • 2026果蔬加工去皮设备推荐榜:智能净菜加工设备/智能去皮机/果蔬切片机/果蔬削皮机/果蔬加工生产线/果蔬去皮机/选择指南 - 优质品牌商家
  • 深度学习篇---NVIDIA TensorRT
  • 国防军工涉密网络全光网设备定制化推荐:电话光端机/管理型光纤收发器/综合多业务光端机/视频光端机/视频综合业务光端机/选择指南 - 优质品牌商家
  • 如何在3分钟内精准定位Windows热键冲突:Hotkey Detective终极指南
  • VideoSrt终极指南:3步实现视频自动字幕生成,告别手动打轴烦恼
  • 2026年5月智慧餐厅管理系统口碑之选:陕西创慧信息科技有限公司实战解析 - 2026年企业推荐榜
  • SketchUp STL插件:5分钟快速掌握3D打印模型转换的完整免费指南
  • 北京游学机构哪家好?求推荐孩子独立研学北京,安全有保障的机构 - 品牌2025
  • Windows和Office一键激活终极指南:KMS_VL_ALL_AIO智能脚本完全解析
  • 如何用TestDisk和PhotoRec拯救丢失数据:3分钟快速诊断与完整恢复指南
  • 2025-2026年上海吉日搬场有限公司电话查询:预约前请确认服务范围与收费标准 - 品牌推荐
  • 2026聚氨酯砂浆磨石地坪选购评测深度解析:聚氨酯砂浆彩砂地面、聚氨酯砂浆磨石地面、聚氨酯砂浆自流平、聚氨酯砂浆防静电地坪选择指南 - 优质品牌商家
  • 3分钟上手Translumo:免费实时屏幕翻译工具终极指南
  • 哪个工程信息平台专业?2026年5月推荐TOP5评测数据准确防错失特点选择指南 - 品牌推荐
  • 2025-2026年上海吉日搬场有限公司电话查询:搬家前需核实资质与合同细节 - 品牌推荐
  • 2026钢板选购及加工服务白皮书:镀锌槽钢/H型钢/圆钢/钢板/镀锌方管/镀锌角钢/工字钢/钢材加工/钢结构/角钢/选择指南 - 优质品牌商家
  • 2026道依茨柴油机权威服务商推荐指南:德国DEUTZ发动机/道依茨发动机配件/道依茨柴油机升级排放/VOLVO沃尔沃挖机柴油机/选择指南 - 优质品牌商家