3911.移除子数组元素后第K小偶数
难度:困难
问题描述:
给你一个整数数组nums,其中nums是严格递增的。
另给你一个二维整数数组queries,其中queriesi=li,ri,ki。
对于每个查询li,ri,ki:
考虑子数组numsli..ri
从无限的所有正偶数序列中:2,4,6,8,10,12,14,...
移除所有出现在子数组numsli..ri中的元素。
找到移除后序列中剩余的第ki个最小整数。
返回一个整数数组ans,其中ansi是第i个查询的结果。
子数组是数组中连续的非空元素序列。
如果数组中的每个元素都严格大于它的前一个元素(如果存在),则称该数组是严格递增的。
示例1:
输入:nums=1,4,7,queries=\[0,2,1,1,1,2,0,0,3]
输出:2,6,6
解释:
i queriesi numsli..ri 移除的偶数 剩余的偶数 ki ansi
0 0,2,1 1,4,7 4 2,6,8,... 1 2
1 1,1,2 4 4 2,6,8,... 2 6
2 0,0,3 1 \[\] 2,4,6,... 3 6
因此,ans=2,6,6。
示例2:
输入:nums=2,5,8,queries=\[0,1,2,1,2,1,0,2,4]
输出:6,2,12
解释:
i queriesi numsli..ri 移除的偶数 剩余的偶数 ki ansi
0 0,1,2 2,5 2 4,6,8,... 2 6
1 1,2,1 5,8 8 2,4,6,... 1 2
2 0,2,4 2,5,8 2,8 4,6,10,12,... 4 12
因此,ans=6,2,12。
示例3:
输入:nums=3,6,queries=\[0,1,1,1,1,3]
输出:2,8
解释:
i queriesi numsli..ri 移除的偶数 剩余的偶数 ki ansi
0 0,1,1 3,6 6 2,4,8,... 1 2
1 1,1,3 6 6 2,4,8,... 3 8
因此,ans=2,8。
提示:
1<=nums.length<=10**5
1<=numsi<=10**9
nums是严格递增的
1<=queries.length<=10**5
queriesi=li,ri,ki
0<=li<=ri<nums.length
1<=ki<=10**9
问题分析:
本问题解决步骤较多,可以将这些步骤分解成几个不同的功能,以函数实现。
一是从nums数组中根据查询queries序列中的一个查询,提取子数组,然后找出其中的偶数构成的序列并返回。这一功能由函数get_sequence_of_even_numbers(nums,querie)实现,其中nums是待查询的原始数组,querie为查询序列中的一个查询。
二是根据查询处理得到的偶数序列a和给定的k值,从无穷的偶数序列中排除a中的偶数之后,找到序列中的第k个最小整数,这通过函数get_k_min_int(a,k)实现。
三是在主程序中利用循环结构对查询序列中的每个查询,利用上面的两个函数进行处理,得到每次查询返回的第k个最小整数,依次存入列表,最后输出该列表即为问题的解。
程序如下:
#根据查询querie找出nums中的子数组,并返回其中的偶数构成的序列
def get_sequence_of_even_numbers(nums,querie):
a=nums[querie[0]:querie[1]+1]
b=list(x for x in a if x%2==0)
return b
#从无穷的偶数序列中排除掉a列表中的偶数之后,找到第k个最小整数并返回
def get_k_min_int(a,k):
n=len(a)
i=0
c=0
while True:
i+=2
if i in a and n>0:
n-=1
continue
else:
c+=1
if c==k:
return i
#主程序
nums=eval(input('pls input nums='))
queries=eval(input('pls input queries='))
t=[]
for i in queries:
a=get_sequence_of_even_numbers(nums,i)
b=get_k_min_int(a,i[2])
t.append(b)
print(t)
运行实例一
pls input nums=1,2,4,7,8,23
pls input queries=\[0,2,5,2,5,7]
14, 18
运行实例二
pls input nums=1,3,5
pls input queries=\[0,2,3]
6