解决leetcode第4033题有效K个不同元素子数组I

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

相关推荐
Patrick在香港1 小时前
Python asyncio vs 多线程 vs 多进程——同一份 HKOpenDataClient 实测 5/30/100 endpoint,谁是真的银弹
开发语言·python
Metaphor6921 小时前
使用 Python 设置 Excel 文件属性
开发语言·python·excel
IT毕设实战小研1 小时前
基于大数据的桂林热门旅游数据分析与可视化
大数据·python·机器学习·数据分析·django·课程设计·旅游
SamChan901 小时前
用PostgreSQL+pgvector构建PDF翻译记忆库:向量相似度检索+增量更新实战
数据库·python·ai·postgresql·pdf·wpf
学linux的QQ蛋1 小时前
Linux 文件 IO:系统调用 open/read/write 完整总结
linux·运维·算法
金融小师妹1 小时前
多因子市场推演:油价、英伟达与杰克逊霍尔如何影响资产定价的AI事件预测框架
人工智能·python·深度学习
rannn_1111 小时前
【力扣hot100】回溯专题|全排列、子集、字母组合、组合总和、括号生成、单词搜索、分割回文串、N皇后
java·算法·leetcode·回溯
大海变好AI1 小时前
AI 工作流怎么搭建提升效率
大数据·人工智能·python
叫我:松哥1 小时前
基于flask图书管理系统,技术栈flask+layui+sqlite+Echarts
后端·python·数据分析·flask·echarts·layui