LCR 186. 文物朝代判断: https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof/description/
教学-图解算法数据结构:https://leetcode.cn/leetbook/detail/illustration-of-algorithm/
原题(表达有问题,建议直接看解析)
展览馆展出来自 13 个朝代的文物,每排展柜展出 5 个文物。某排文物的摆放情况记录于数组 places,其中 places[i] 表示处于第 i 位文物的所属朝代编号。其中,编号为 0 的朝代表示未知朝代。请判断并返回这排文物的所属朝代编号是否连续(如遇未知朝代可算作连续情况)。
示例 1:
输入: places = [0, 6, 9, 0, 7]
输出: True
示例 2:
输入: places = [7, 8, 9, 10, 11]
输出: True
提示:
places.length = 5
0 <= places[i] <= 13
思路
https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof/description/comments/2236358
连续不管在数组中顺序,即[0, 6, 9, 0, 7]是连续是因为 0 6 7 0 9,返回true,
0像扑克牌的赖子,可以替代任何数
不能有重复的数
第一:只有五个数
第二:如果五个数是连续的 比如:1 2 3 4 5 返回true
第三:重复的即使连续也要返回false 比如:1 1 2 3 4
第四:0可以代替任何数:比如0 0 0 1 5也是返回true 因为可以变成 1 2 3 4 5
代码
- 除未知朝代外,所有朝代 无重复 ;
- 设 5 个朝代中最大的朝代序号为 ma ,最小的朝代序号为 mi (未知朝代除外),则需满足 ma-mi<5 (python中自带的函数为min ,max注意区分)
- 代码遇到0跳过
python
class Solution:
def checkDynasty(self, places: List[int]) -> bool:
repeat = set()
ma, mi = 0, 14
for place in places:
if place == 0: continue # 跳过未知朝代
ma = max(ma, place) # 最大编号朝代
mi = min(mi, place) # 最小编号朝代
if place in repeat: return False # 若有重复,提前返回 false
repeat.add(place) # 添加朝代至 Set
return ma - mi < 5 # 最大编号朝代 - 最小编号朝代 < 5 则连续
#https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof/solutions/212071/mian-shi-ti-61-bu-ke-pai-zhong-de-shun-zi-ji-he-se/
本地调试版本
bash
def checkDynasty(places):
mi,ma=15,-1
repeat=set()
for p in places:
print("p",p)
if p==0:
print('i')
continue
# print("mi,ma",mi,ma)
if p>ma: ma=p
if p<mi: mi=p
if p in repeat: return False
repeat.add(p)
print("mi,ma",mi,ma)
return ma-mi<5
input2=[0,6,9,0,7]
a=checkDynasty(input2)
print(a)