3911.移除子数组元素后第K小偶数
难度:困难
问题描述:
给你一个整数数组nums,其中nums是严格递增的。
另给你一个二维整数数组queries,其中queries[i]=[li,ri,ki]。
对于每个查询[li,ri,ki]:
考虑子数组nums[li..ri]
从无限的所有正偶数序列中:2,4,6,8,10,12,14,...
移除所有出现在子数组nums[li..ri]中的元素。
找到移除后序列中剩余的第ki个最小整数。
返回一个整数数组ans,其中ans[i]是第i个查询的结果。
子数组是数组中连续的非空元素序列。
如果数组中的每个元素都严格大于它的前一个元素(如果存在),则称该数组是严格递增的。
示例1:
输入:nums=[1,4,7],queries=[[0,2,1],[1,1,2],[0,0,3]]
输出:[2,6,6]
解释:
i queries[i] nums[li..ri] 移除的偶数 剩余的偶数 ki ans[i]
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 queries[i] nums[li..ri] 移除的偶数 剩余的偶数 ki ans[i]
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 queries[i] nums[li..ri] 移除的偶数 剩余的偶数 ki ans[i]
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<=nums[i]<=10**9
nums是严格递增的
1<=queries.length<=10**5
queries[i]=[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