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

Leetcode 3629. Minimum Jumps to Reach End via Prime Teleportation

  • Leetcode 3629. Minimum Jumps to Reach End via Prime Teleportation
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3629. Minimum Jumps to Reach End via Prime Teleportation

1. 解题思路

这一题思路上还是比较直接的,就是一个广度优先遍历,考察各条路径当中最先到达终点的走法。

但是,要进行路径的遍历,我们需要提前计算出jump点,也就意味着我们必须要提前找出所有的素数节点以及其对应的可以跳跃的位置,即对于那些非素数的节点,我们要找出他们各自都有哪些质因素才行。

而这个就是一个基础优化的问题了,这里就不过多展开了,大家对这代码理解一下就行,简单来说就是一个数要么自己是一个素数,要么他必然可以拆成两个数的乘积,那么至少其有一个质因子小于其平方根,因此,我们就可以优化我们的遍历过程了。

2. 代码实现

给出python代码实现如下:

def get_primes(n):status = [0 for _ in range(n+1)]primes = set()for i in range(2, n+1):if status[i] != 0:continueprimes.add(i)for j in range(i, n+1, i):status[j] = 1return primesPRIMES = get_primes(10**6)
PRIME_LIST = list(sorted(PRIMES))class Solution:def minJumps(self, nums: List[int]) -> int:n = len(nums)@lru_cache(None)def get_prime_factors(num):if num in PRIMES:return [num]idx = bisect.bisect_right(PRIME_LIST, sqrt(num)+1)-1for i in range(idx, -1, -1):if num % PRIME_LIST[i] == 0:while num % PRIME_LIST[i] == 0:num = num // PRIME_LIST[i]return [PRIME_LIST[i]] + get_prime_factors(num)return []primes = {num for num in nums if num in PRIMES}jump = defaultdict(list)for i, num in enumerate(nums):for p in get_prime_factors(num):if p in primes:jump[p].append(i)     seen = {0}q = [(0, 0)]while q:step, idx = heapq.heappop(q)idx = -idxif idx == n-1:return stepif idx-1 >= 0 and idx-1 not in seen:heapq.heappush(q, (step+1, -idx+1))seen.add(idx-1)if idx+1 < n and idx+1 not in seen:if idx+1 == n-1:return step+1heapq.heappush(q, (step+1, -idx-1))seen.add(idx+1)if nums[idx] in PRIMES:for nxt in jump[nums[idx]]:if nxt == n-1:return step+1if nxt not in seen:heapq.heappush(q, (step+1, -nxt))seen.add(nxt)return -1

提交代码评测得到:耗时3037ms,占用内存64.27MB。

http://www.xdnf.cn/news/1197829.html

相关文章:

  • 学习游戏制作记录(改进投掷剑的行为)7.27
  • 孤儿进程、僵尸进程和守护进程
  • 【element-ui】HTML引入本地文件出现font找不到/fonts/element-icons.woff
  • Android CameraX 使用指南:简化相机开发
  • 从零搭建3D激光slam框架-基于mid360雷达节点实现
  • [10月考试] C
  • 论文阅读-IGEV
  • Java进阶7:Junit单元测试
  • Windows10系统使用Cmake4.1.0构建工具+Visual Studio2022编译Opencv4.11教程
  • LabelImg:简洁高效的图像标注工具和下载
  • B站直播视频 | 深度讲解 Yocto 项目:从历史、架构到实战与趋势
  • Vue vuex模块化编码
  • 网络基础19:OSPF多区域实验
  • 中级全栈工程师笔试题
  • Maven之多模块项目管理
  • 什么是加密货币中的节点?
  • 【Linux系统编程】环境变量,进程地址空间与进程控制
  • 使用GIS中基于森林的分类与回归模型来估算房屋价值
  • 工业控制系统安全之 Modbus 协议中间人攻击(MITM)分析与防范
  • 解决ubantu系统下matplotlib中文乱码问题
  • 逆向入门(43)程序逆向篇-tsrh-crackme
  • 【笔记】系统
  • 20250727让飞凌OK3576-C开发板在Rockchip的原厂Android14下通过耳机播音
  • 【设计】设计一个web版的数据库管理平台后端(之二)
  • 29.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--用户配置服务
  • Java中排序规则详解
  • solidity从入门到精通 第六章:安全第一
  • vmware虚拟机中 ubuntu 20.04通过nat设置静态ip(固定ip)
  • Java学习-------桥接模式
  • 文件权限标记机制在知识安全共享中的应用实践