news 2026/5/25 0:26:26

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 队列。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 0:23:29

3分钟上手Translumo:免费实时屏幕翻译工具终极指南

3分钟上手Translumo&#xff1a;免费实时屏幕翻译工具终极指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 你是否在游…

作者头像 李华
网站建设 2026/5/25 0:18:39

CD-GraB算法:协调数据顺序,加速分布式机器学习收敛

1. 分布式机器学习中的收敛瓶颈与数据顺序的隐秘关联在分布式机器学习的世界里&#xff0c;我们每天都在和数据、算力、时间赛跑。当你把训练任务拆分到多个GPU或服务器节点上并行执行时&#xff0c;一个看似不起眼的问题往往会成为性能提升的“暗礁”&#xff1a;数据以什么顺…

作者头像 李华
网站建设 2026/5/25 0:13:30

[开源] 病历自举报系统:面向临床质控的电子病历智能预审工具,用大模型扮演质疑者角色发现逻辑矛盾与缺项问题

本项目是一个专为中文电子病历&#xff08;EMR&#xff09;设计的轻量级质控辅助工具&#xff0c;核心目标是让医生在提交病历前&#xff0c;就能快速识别出文本中潜藏的逻辑矛盾、信息缺项、时间线错乱、数值异常和主观夸大等典型质量问题。我们不替代人工质控&#xff0c;也不…

作者头像 李华
网站建设 2026/5/25 0:06:58

键盘定制指南:从硬件到软件,开启实用又有趣的键盘使用体验!

引言 我钟情于键盘&#xff0c;因其是高效的人机交互接口&#xff0c;且充满“趣味”。用力敲击大按键&#xff0c;无需思索&#xff1b;体验精确组合的键盘快捷键带来的掌控感&#xff0c;皆是乐事。看着屏幕内容随操作而变&#xff0c;特别是那些契合自身工作方式的反馈&…

作者头像 李华