1. 问题背景与核心挑战
这道算法题描述了一个有趣的场景:我们需要在一个整数数组中找到从起点到终点的最少跳跃次数,跳跃规则包含两种移动方式。第一种是常规的相邻位置移动(i+1或i-1),第二种则是基于质数的特殊传送机制——如果当前位置的数字是质数p,可以瞬间传送到数组中任何能被p整除的数字所在位置。
这种混合移动方式带来了几个关键挑战:
- 质数判断与质因数分解的效率问题,特别是当数组长度和数值范围较大时(题目中n≤100000,nums[i]≤1000000)
- 如何在跳跃过程中合理利用质数传送机制来优化路径
- 确保找到的路径确实是跳跃次数最少的方案
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解决方案的整体架构
2.1 预处理阶段:质因数筛法
我们采用改进的埃拉托斯特尼筛法来预处理每个数的质因数。这个预处理的核心优势在于:
- 只需要执行一次全局初始化
- 后续查询任何数的质因数都是O(1)时间复杂度
- 空间复杂度控制在合理范围内(1,000,001个元素的数组)
go复制const mx = 1_000_001
var primeFactors = [mx][]int{}
func init() {
for i := 2; i < mx; i++ {
if primeFactors[i] == nil { // i是质数
for j := i; j < mx; j += i {
primeFactors[j] = append(primeFactors[j], i)
}
}
}
}
2.2 构建质数分组索引
遍历输入数组,为每个质数建立位置索引表。这个步骤的关键点:
- 只处理真正的质数(质因数列表长度为1且大于1的数)
- 使用map[int][]int结构存储,键是质数,值是该质数出现的所有位置索引
- 这种结构为后续的BFS搜索提供了快速查询能力
go复制groups := map[int][]int{}
for i, x := range nums {
if len(primeFactors[x]) == 1 && x > 1 {
groups[x] = appen
