Leetcode 剑指 Offer II 186. 文物朝代判断

题目难度: 简单
原题链接
今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

展览馆展出来自 13 个朝代的文物,每排展柜展出 5 个文物。某排文物的摆放情况记录于数组 places,其中 placesi 表示处于第 i 位文物的所属朝代编号。其中,编号为 0 的朝代表示未知朝代。请判断并返回这排文物的所属朝代编号是否能够视为连续的五个朝代(如遇未知朝代可算作连续情况)。

示例 1:

  • 输入:places = 0, 6, 9, 0, 7
  • 输出:True

示例 2:

  • 输入:places = 7, 8, 9, 10, 11
  • 输出:True

提示:

  • places.length = 5
  • 0 <= placesi <= 13

题目思考

  1. 朝代连续需要满足什么条件?

解决方案

思路
  • 分析题目, 我们可以把数字分为两类, 0 和非 0 的数
  • 对于非 0 的数而言, 显然首先它要不能重复, 其次最大最小值之差要小于 5, 否则中间一定会有空位
  • 而对于 0 而言, 它可以变成任意数, 所以只要非 0 数的条件满足后, 直接用 0 来填充空位即可形成连续的朝代
  • 所以我们可以使用一个集合专门存储非 0 的数, 有重复的话直接返回 false, 最后再拿到非 0 数的最大最小值, 判断它们之差是否小于 5 即可
复杂度
  • 时间复杂度 O(1): 常数次判断
  • 空间复杂度 O(1): 只使用了常数个变量
代码
python 复制代码
class Solution:
    def checkDynasty(self, places: List[int]) -> bool:
        # 使用集合判断非0数是否有重复
        # 然后判断非0数的最大最小值差值是否小于5
        v = set()
        # 初始化最大值和最小值, 有效的非0数一定大于或小于该初始值
        mn, mx = 14, 0
        for x in places:
            if x != 0:
                if x in v:
                    # 发现重复非0数了, 当前序列无效
                    return False
                # 将非0数加入集合中
                v.add(x)
                # 求非0数的最大最小值
                mn = min(mn, x)
                mx = max(mx, x)
        return mx - mn < 5
相关推荐
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 205. 同构字符串 | C++ 双向绑定与哈希表映射
c++·算法·leetcode
午彦琳13 小时前
2026.9.17
数据结构·算法·leetcode
木井巳14 小时前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法
All for pursuit.17 小时前
【链表-9】146.LRU缓存
数据结构·c++·算法·leetcode
圣保罗的大教堂17 小时前
leetcode 1477. 找两个和为目标值且不重叠的子数组 中等
leetcode
hanlin0318 小时前
刷题笔记:力扣第144题-二叉树的前序遍历
笔记·算法·leetcode
圣保罗的大教堂20 小时前
leetcode 3629. 通过质数传送到达终点的最少跳跃次数 中等
leetcode
圣保罗的大教堂20 小时前
leetcode 1914. 循环轮转矩阵 中等
leetcode
wabs66621 小时前
关于二叉树【力扣100.相同的树的思考】
数据结构·c++·算法·leetcode·二叉树·递归法