解决leetcode第3948题字典序最大的MEX数组

3948.字典序最大的MEX数组

难度:困难

问题描述:

给你一个整数数组nums。

你需要构造一个数组result,具体做法是重复执行以下操作,直到nums变为空:

选择一个整数k,满足1<=k<=len(nums)。

计算nums的前k个元素的MEX。

将这个MEX附加到result。

从nums中移除前k个元素。

返回执行这些操作后能得到的字典序最大的数组result。

数组的MEX是指数组中不包含的最小非负整数。

如果两个数组a和b在第一个不同的下标处,数组a的元素大于数组b的对应元素,则数组a字典序大于数组b。如果前min(a.length,b.length)个元素都相同,那么较长的数组是字典序更大的数组。

示例1:

输入:nums=0,1,0

输出:2,1

解释:

取前k=2个元素0,1,其MEX=2。当前result=2。

剩余数组0的MEX=1。因此,最终的result=2,1。

示例2:

输入:nums=1,0,2

输出:3

解释:

取前k=3个元素1,0,2,其MEX=3。

nums现在为空。因此,最终的result=3。

示例3:

输入:nums=3,1

输出:0,0

解释:

取k=1,第一个元素3的MEX=0。当前result=0。

剩余数组1的MEX=0。因此,最终的result=0,0。

提示:

1<=nums.length<=10**5

0<=numsi<=10**5

问题分析:

解决本问题,要处理两个问题,一是MEX要大,二是在MEX尽可能大的同时,处理次数尽可能多,这样才能得到字典序最大的result数组。为此设计两个函数,一是 get_mex(a),其功能是找出一个数组a中不包含的最小非负整数MEX,二是split_array(a),其功能是对一个数组a进行最小拆分,返回拆分位置和MEX值。主程序利用循环,将每一次得到的MEX添加到result中,并根据拆分位置,生成下一次要进行拆分处理的数组a,直到不能拆分为止,最后输出result即可。

程序如下:

python 复制代码
#找出一个数组中不包含的最小非负整数即MEX并返回
def get_mex(a):
    b=list(x for x in a if x>=0)
    c=sorted(list(set(b)))
    i=0
    while True:
        if i in c:
            i+=1
            continue
        else:
            return i

#将a分成两部分,从第一个元素开始向后面查找,直到某一个元素之后,若前面部分(包括这个元素)的mex=mex,返回索引号i和mex
# 如果这个元素是最后一个元素,则返回n和mex
def split_array(a):
    m=get_mex(a)
    n=len(a)
    for i in range(1,n+1):
        t=a[:i]
        if get_mex(t)==m:
            return [i,m]
        else:
            continue

#主程序
a=eval(input('pls input a='))
result=[]
n=len(a)
while True:
    i, m = split_array(a)
    if i==n:
        result.append(m)
        break
    else:
        result.append(m)
        a=a[i:]
        n=len(a)
print(result)

运行实例一

pls input a=3,2,1,0,1,2,1

4, 0, 0, 0

运行实例二

pls input a=-1,2,1,0,-3,0,1

3, 2

相关推荐
小oo呆1 小时前
【学习心得】Python多线程
python
happylifetree5 小时前
Python70:核心语法-函数进阶-案例2
python
王中阳Go5 小时前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
BK贝壳5 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
Sakura_j_h_6 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
supabc1237 小时前
欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则
xml·python·开源·电子发票·1024程序员节
ZhengEnCi8 小时前
AI Agent工具调用防护层怎么写-一份能直接跑的Python四层拦截实现
python·llm·agent
企业数字化笔记8 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
ZhengEnCi8 小时前
AI Agent工具误调用怎么解决-从参数校验到高危二次确认的四层工程防线
python·llm·agent
?abc!9 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode