4033.有效K个不同元素子数组I
难度:困难
问题描述:
给你一个整数数组nums和一个整数k。
同时给你一个二维整数数组queries,其中queriesi=li,ri表示子数组numsli..ri。
对于每个查询,如果满足以下条件,则认为子数组numsli..ri是有效的:
它包含恰好k个不同的数字,且
子数组中每个数字的频率都是偶数。
注意:子数组中一个数字的频率是指它在该子数组中出现的次数。
返回一个布尔数组ans,其中如果numsli..ri是有效的,则ansi为true,否则为false。
子数组是数组中一段连续的、非空的元素序列。
示例1:
输入:nums=1,2,2,1,k=2,queries=\[0,1,0,3,1,2]
输出:false,true,false
解释:
i li,ri 子数组 不同数字 频率 有效性检查
0 0,1 1,2 {1,2}→2 {1:1,2:1} false:元素频率不是偶数。
1 0,3 1,2,2,1 {1,2}→2 {1:2,2:2} true:恰好k=2个不同的元素,全部出现偶数次。
2 1,2 2,2 {2}→1 {2:2} false:不同元素的数量少于k=2。
因此,ans=false,true,false。
示例2:
输入:nums=3,3,3,k=1,queries=\[1,2,0,2]
输出:true,false
解释:
i li,ri 子数组 不同数字 频率 有效性检查
0 1,2 3,3 {3}→1 {3:2} true:恰好k=1个不同的元素,出现偶数次。
1 0,2 3,3,3 {3}→1 {3:3} false:3出现的次数不是偶数。
因此,ans=true,false。
提示:
2<=n==nums.length<=10**5
1<=numsi<=10**5
1<=k<=n
1<=queries.length<=10**5
queriesi==li,ri
0<=li<ri<=n-1
问题分析:
本问题是一个把复杂问题分解成几个简单问题来解决的很好案例,它必须解决这样几个问题:一是通过queries中的查询从原始数组nums中提取出对应的子数组;二是判断一个查询出来的子数组是不是有效的,即子数组中不同的元素元素个数是不是刚好K个,而且每个元素出现的频率是不是偶数;三是为了解决好第二个小问题,把一个子数组中每个元素出现的频率是否为偶数,单独拿出来进行检验设计。
根据上面的分解,对应设计三个函数:
函数get_sub_array_according_to_one_queriy(nums,queriy)负责从nums中根据一条查询queriy提取子数组;
函数get_judgment_according_to_number_of_element(nums)用于检验一个子数组nums中各元素的个数是不是偶数个,返回逻辑值;
函数validity_check(nums,k)检验提取出的子数组nums是否有效,返回逻辑值。
主程序则利用循环从queries中获取查询queriy,并据此在nums中提取出子数组sub_array,然后检验其有效性,并将检验结果存入列表t中,最后输出列表t,问题得以解决。
程序如下:
python
#根据queries中的一个查询,从nums数组中提取子数组
def get_sub_array_according_to_one_queriy(nums,queriy):
return nums[queriy[0]:queriy[1]+1]
#统计一个数组nums中各个元素的个数,如果都是偶数,返回True,否则返回False
def get_judgment_according_to_number_of_element(nums):
t = set(nums)
for i in t:
if nums.count(i)%2==0:
continue
else:
return False
else:
return True
#对一个经过查询生成的子数组nums进行有效性检查,结果返回True或False
def validity_check(nums,k):
t=set(nums)
n=len(t)
if n==k and get_judgment_according_to_number_of_element(nums):
return True
else:
return False
#主程序
nums=eval(input('pls input nums='))
k=int(input('pls input k='))
queries=eval(input('pls input queries='))
t=[]
for query in queries:
sub_array=get_sub_array_according_to_one_queriy(nums,query)
if validity_check(sub_array,k):
t.append(True)
else:
t.append(False)
print(t)
运行实例一
pls input nums=1,2,2,1,3
pls input k=2
pls input queries=\[0,1,1,2,0,3,0,4]
False, False, True, False
运行实例二
pls input nums=1,3,2,4
pls input k=2
pls input queries=\[0,1,0,2]
False, False