news 2026/8/20 11:47:23

Kimi LeetCode LCP 15. 游乐园的迷宫 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi LeetCode LCP 15. 游乐园的迷宫 Java实现

以下是 LeetCode LCP 15. 游乐园的迷宫 的 Java 实现,基于 贪心 + 向量叉积 的经典解法。

解题思路

核心思想是贪心构造:每一步选择一个"最极端"的点,使得剩余所有未访问的点都在当前方向的同一侧,从而保证后续每一步都能满足转向要求。

1. 起点选择:选择横坐标最小的点(若有多个则选纵坐标最小的),这样可以保证从该点出发,所有其他点都在起点的同一侧
2. 向量叉积判断方向:对于当前点 `now`,候选点 `j`,计算向量 `now→j` 与当前最优向量 `now→best` 的叉积
- 叉积 > 0:`j` 在 `best` 的逆时针方向(左侧)
- 叉积 < 0:`j` 在 `best` 的顺时针方向(右侧)
3. 贪心策略:
- 下一步要左转(`L`):选择最右侧的点(叉积最小,即顺时针最极端)
- 下一步要右转(`R`):选择最左侧的点(叉积最大,即逆时针最极端)

```java
import java.util.*;

class Solution {

/**
* 向量叉积:a × b = ax * by - ay * bx
* 叉积 > 0: b 在 a 的逆时针方向(左侧)
* 叉积 < 0: b 在 a 的顺时针方向(右侧)
* 叉积 = 0: 共线(题目保证不存在三点共线)
*/
private long cross(long ax, long ay, long bx, long by) {
return ax * by - ay * bx;
}

public int[] visitOrder(int[][] points, String direction) {
int n = points.length;
int[] ans = new int[n];
boolean[] used = new boolean[n];

// 1. 选择起点:横坐标最小的点(若有多个选纵坐标最小的)
int start = 0;
for (int i = 1; i < n; i++) {
if (points[i][0] < points[start][0] ||
(points[i][0] == points[start][0] && points[i][1] < points[start][1])) {
start = i;
}
}

ans[0] = start;
used[start] = true;
int cur = start; // 当前所在点

// 2. 根据 direction 依次选择下一个点
for (int i = 0; i < n - 2; i++) {
char d = direction.charAt(i);
int next = -1;
long bestX = 0, bestY = 0; // 当前最优向量

for (int j = 0; j < n; j++) {
if (used[j]) continue;

long vx = points[j][0] - points[cur][0];
long vy = points[j][1] - points[cur][1];

if (next == -1) {
// 第一个候选点
next = j;
bestX = vx;
bestY = vy;
continue;
}

long crossVal = cross(bestX, bestY, vx, vy);

if (d == 'L') {
// 下一步要左转,选择最右侧的点(顺时针方向,叉积 < 0)
if (crossVal < 0) {
next = j;
bestX = vx;
bestY = vy;
}
} else {
// 下一步要右转,选择最左侧的点(逆时针方向,叉积 > 0)
if (crossVal > 0) {
next = j;
bestX = vx;
bestY = vy;
}
}
}

ans[i + 1] = next;
used[next] = true;
cur = next;
}

// 3. 最后一个未访问的点
for (int i = 0; i < n; i++) {
if (!used[i]) {
ans[n - 1] = i;
break;
}
}

return ans;
}
}
```

关键点说明

步骤 说明
起点选择 选横坐标最小的点,保证所有其他点都在起点的同一侧(右侧),为后续转向创造条件
叉积判断 `cross(a, b) > 0` 表示 `b` 在 `a` 的左侧(逆时针);`< 0` 表示在右侧(顺时针)
L 策略 下一步左转 → 选当前点最右侧的点(顺时针最极端),这样剩余点都在该方向的左侧,下一步自然左转
R 策略 下一步右转 → 选当前点最左侧的点(逆时针最极端),这样剩余点都在该方向的右侧,下一步自然右转
最后一点 `direction` 长度为 `n-2`,确定前 `n-1` 个点后,最后剩下 1 个点直接加入

示例验证

```
输入: points = [[1,1],[1,4],[3,2],[2,1]], direction = "LL"

起点: 点0(1,1) — 横坐标最小
→ 第一步 direction[0]='L',从(1,1)出发选最右侧点
候选: (1,4)向量(0,3), (3,2)向量(2,1), (2,1)向量(1,0)
叉积判断最右侧 → 选点2(3,2)
→ 第二步 direction[1]='L',从(3,2)出发选最右侧点
候选: (1,4)向量(-2,2), (2,1)向量(-1,-1)
叉积判断最右侧 → 选点1(1,4)
→ 最后剩下点3(2,1)

输出: [0, 2, 1, 3] ✓
```

复杂度分析

- 时间复杂度:O(n²),每次选择下一个点需要遍历所有未访问点
- 空间复杂度:O(n),答案数组和访问标记数组

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

国六排放标准深度解析:从RDE测试到远程监控的移动源污染治理

1. 从一场会议看产业风向&#xff1a;蓝天保卫战与国六推进的深层逻辑 最近&#xff0c;一场关于蓝天保卫战三年行动计划部署的会议引发了广泛关注。作为长期关注环保政策与汽车产业交叉领域的从业者&#xff0c;我习惯性地去拆解这类新闻背后的信号。标题里提到的“国六会加速…

作者头像 李华
网站建设 2026/8/20 11:44:35

Git误操作数据恢复指南:使用reflog找回丢失的提交

这次我们来看一个 Git 用户几乎都会遇到的“惊魂时刻”&#xff1a;执行了git reset命令后&#xff0c;发现提交记录不见了&#xff0c;工作成果似乎瞬间消失。别慌&#xff0c;Git 内置了强大的“时光机”——git reflog。这篇文章不讲复杂概念&#xff0c;直接告诉你&#xf…

作者头像 李华
网站建设 2026/8/20 11:44:32

构建多模态AI智能体框架:驱动科学知识策展的未来

1. 项目概述&#xff1a;为科学知识管理构建多模态智能体框架最近在AI和科学信息处理领域&#xff0c;一个概念被频繁提及&#xff1a;如何让AI智能体&#xff08;Agent&#xff09;像一位经验丰富的科研助理&#xff0c;主动从海量、杂乱的多模态数据源中&#xff0c;帮助我们…

作者头像 李华
网站建设 2026/8/20 11:42:17

告别网盘下载限制:免费脚本一键生成八大网盘直链

告别网盘下载限制&#xff1a;免费脚本一键生成八大网盘直链 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 …

作者头像 李华
网站建设 2026/8/20 11:40:15

GLM-5.3设为WorkBuddy常用模型:从配置到高效集成的实战指南

1. 先搞清楚 GLM-5.3 和 WorkBuddy 到底是什么关系 如果你最近在关注大模型应用&#xff0c;可能已经注意到“GLM-5.3 上线 WorkBuddy 可设为常用模型”这个动态。这听起来像是一个功能更新&#xff0c;但背后其实是一个很明确的信号&#xff1a; 大模型正在从“玩具”和“演示…

作者头像 李华
网站建设 2026/8/20 11:40:00

AI模型安全部署:从沙箱隔离到代理权限控制的工程实践

在实际 AI 应用开发中&#xff0c;模型的安全性和可控性是部署前必须评估的关键环节。近期围绕 Kimi K3 模型的一些讨论&#xff0c;特别是关于其在特定安全评测场景下的表现&#xff0c;引发了开发者对 AI 模型行为边界、沙箱环境配置以及代理权限管理的深度思考。本文将从工程…

作者头像 李华