[LeetCode解题报告] LCP 49. 环形闯关游戏

  • 一、 题目
    • 1. 题目描述
    • 2. 原题链接
  • 二、 解题报告
    • 1. 思路分析
    • 2. 复杂度分析
    • 3. 代码实现
  • 三、 本题小结
  • 四、 参考链接

一、 题目

1. 题目描述

2. 原题链接

链接: LCP 49. 环形闯关游戏

二、 解题报告

1. 思路分析

 预处理按位贪心。
  • 假设我们存在一个方法check(val),可以查询当前数字是否存在方案成功闯关。
  • 那么,我们可以从高位到低位遍历每个位1是否是必须要:
  • 即,如果要判断二进制s=10000,s的最右的这个1是否需要,那只需要判断s-1=01111是否可以通关,如果可以,那这位就不需要;
  • 如果不可以通关,那这位就是必要的。
  • 因此可以初始化ans=0,然后从高到低逐位判断ans|(s-1)是否可以通关,如果可以就不要这位s;否则必须要,ans|=s

  • 那么check(val)方法怎么实现呢。
  • 只能尝试每一位作为起点,然后向左右扩展,显然一次时间复杂度是O(n^2)。
  • 那么需要剪枝。两个方案。
    1. 每次check内设置visited,如果前边没能成功的起点已经途径过这个点,那么不需要它作为起点了。因为它作为途经,当时的状态不可能小于自己,都转不完,那它作为起点更转不完了。
    1. 预处理一下challenge数组,计算每个点作为起点且起始分正好是它自己的话,左右最远能延伸到哪,那就可以直接跳到左右两端了。
  • 最坏时间复杂度没变,但是能过了。

2. 复杂度分析

最坏时间复杂度O(n × 61)

3. 代码实现

class Solution:def ringGame(self, challenge: List[int]) -> int:n = len(challenge)vis = [-1]*nnxt=lambda i:(i+1) if i < n-1 else 0pre = lambda i :i-1 if i > 0 else n-1# d = challenge+challenge# n2 = n*2# left = list(range(n2))# left_s = d[:]# for i in range(1,n2):#     if d[i] >= d[i-1]:#         left[i] = left[i-1]#         left_s[i-1] |= left_s[i-1]# left = [left[i]%n for i in range(n,n2)]# left_s = left_s[:n]# right = list(range(n2))# right_s = d[:]# for i in range(n2-2,-1,-1):#     if d[i]>= d[i+1]:#         right[i] = right[i+1]#         right_s[i] != right_s[i+1]# right = [right[i]%n for i in range(n)]# right_s = right_s[:n]d = challenge+challengen2 = n*2left = list(range(n2))left_s = d[:]for i in range(1,n2):j = i - 1while j >= 0 and left_s[i] >= d[j]:left_s[i] |= left_s[j]left[i] = left[j]j =left[j] - 1left = [left[i]%n for i in range(n,n2)]left_s = left_s[:n]right = list(range(n2))right_s = d[:]for i in range(n2-2,-1,-1):j = i + 1while j < n2 and right_s[i] >= d[j]:right_s[i] |= right_s[j]right[i] = right[j]j = right[j] + 1right = [right[i]%n for i in range(n)]right_s = right_s[:n]# print(left_s,right_s)# print(left_s,right_s)def check(val):for i in range(n):if val < challenge[i]:continue# if vis[i] == val:#     continue# s = val|challenge[i]# # vis[i] = val# l = r = is = val | left_s[i] | right_s[i]l,r = left[i],right[i]while True:# print(s,l,r,i)if l == nxt(r):return True  # 成环if s >= challenge[pre(l)]:   # 左右尝试吃l = pre(l)# vis[l] = vals |= challenge[l]elif s >= challenge[nxt(r)]: r = nxt(r)# vis[r] = vals |= challenge[r]else:  # 吃不到就完了break                 return Falses = 1<<62ans = 0while s:if check((ans|s)-1) == False:ans |= s s >>= 1# print(check(3,4))return ans

三、 本题小结

  1. 按位贪心,第一次写

四、 参考链接

[LeetCode解题报告] LCP 49. 环形闯关游戏相关推荐

  1. [LeetCode解题报告] LCP 48. 无限棋局

    [LeetCode解题报告] LCP 48. 无限棋局 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. ...

  2. LeetCode解题报告汇总

    LeetCode解题报告: [LeetCode]1.Two Sum - Yoona - 博客频道 - CSDN.NET [LeetCode]2.Add Two Numbers - Yoona - 博客 ...

  3. [LeetCode解题报告] 741. 摘樱桃

    [LeetCode解题报告] 741. 摘樱桃 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. 题目描述 ...

  4. [LeetCode解题报告] 365. 水壶问题

    [LeetCode解题报告] 365. 水壶问题 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. 题目描 ...

  5. 网页闯关游戏(riddle webgame)--SQL注入的潘多拉魔盒

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. web开发初学者往往会忽视一些常见的漏洞 ...

  6. pythonchallenge闯关游戏_PythonChallenge闯关详解

    前言 PythonChallenge是国外的一位工程师设计的一套编程闯关游戏,网址:PythonChallenge,每一关都可以用一段Python程序解决问题得到下一关的入口,本博文作为一个学习笔记, ...

  7. 网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 本文讲描述, 如何在网页端实现一个仿微信 ...

  8. 安卓3d游戏引擎_3D球闯关游戏-3D球闯关游戏安卓官方版预约 v1.2.5

    3D球闯关游戏是一款让人上瘾的球球跳跃闯关游戏,在音轨上不断跳跃,控制球球顺利到达终点,玩家需要在曼妙的背景音乐下找到自己的闯关节奏,大家只有找到了节奏才能更轻松的完成挑战,轻松点击球球就可以让它不断 ...

  9. 横板闯关游戏中的角色移动

    前言 在很多2D游戏中,都会涉及到角色移动,跳跃等操作,最典型的就是横板闯关游戏.例如经典的魂斗罗.三国战纪等.这两款游戏在地图移动和角色行走的方式中唯一的不同就是魂斗罗是没有纵深的那种. 看似简单, ...

最新文章

  1. 如何在XenServer主机上安装虚拟机
  2. python 比较列表相邻元素(找相同或去重)
  3. 读债务危机0824:随笔
  4. openjdk platform binary 内存_记一次内存溢出导致的生产事故
  5. 多段实例代码详解7大类Python运算符,建议收藏!
  6. ArrayList和LinkedList(转)
  7. 开源博客-秋色园QBlog多用户博客系统安装视频教程
  8. 详述欺骗性断言如何引发严重的 Windows 内核漏洞 (CVE-2020-0792)
  9. Cisco职业认证再认证体系及程序问答
  10. python电脑下载了怎么用-利用Python下载:You-Get的安装及使用方法
  11. ubuntu查看cpu温度
  12. 长文预警-超详细的熊猫烧香病毒分析_01
  13. [LeetCode]Burst Balloons 爆气球
  14. Mysql orchestrator高可用
  15. JVM垃圾回收器-CMS并发标记清除
  16. win10系统上安装awvs漏洞扫描器
  17. vi 从第几行到第几行 替换_vi全局替换方法:
  18. 软件测试工程师项目业绩怎么写,软件工程师的“项目业绩”如何才能脱颖而出?...
  19. 仿GTS实现的分布式事务框架meepo
  20. SDUWH2019-2020寒假python实训--Chp2

热门文章

  1. Python爬虫入门实战之猫眼电影数据抓取(实战篇)
  2. 1天烧掉10万美元的ChatGPT正式开放API:成本大砍90%,75万个单词仅收费2美元
  3. 触控一体机怎么实现无线投屏功能?
  4. Mac下Sublime Text 2设置subl命令
  5. 操作系统权限提升(二十三)之Linux提权-通配符(ws)提权
  6. CVPR 2022 论文列表
  7. Istio超时与重试
  8. ArcGis 在线地图相关资源
  9. Linux配置网卡信息
  10. javaee中forward /redirect核心区别