题目
链接:https://www.nowcoder.com/questionTerminal/1d6f8e0e16de49d094d16057c92d49de?f=discussion
来源:牛客网
小明有一个花园,花园里面一共有m朵花,对于每一朵花,都是不一样的,小明用1~m中的一个整数表示每一朵花。
他很喜欢去看这些花,有一天他看了n次,并将n次他看花的种类是什么按照时间顺序记录下来。
记录用a[i]表示,表示第i次他看了a[i]这朵花。
小红很好奇,她有Q个问题,问[l,r]的时间内,小明一共看了多少朵不同的花儿,小明因为在忙着欣赏他的花儿,所以想请你帮他回答这些问题。
输入描述:
输入两个数n,m;(1<=n<=2000,1<=m<=100);分别表示n次看花,m表示一共有m朵花儿。
接下来输入n个数a[1]~a[n],a[i]表示第i次,小明看的花的种类;
输入一个数Q(1<=Q<=1000000);表示小红的问题数量。
输入Q行 每行两个数l,r(1<=l<=r<=n);表示小红想知道在第l次到第r次,小明一共看了多少不同的花儿。
输出描述:
一共Q行
每一行输出一个数 表示小明在[l,r]的时间内看了多少种花。
示例1
输入
5 3
1 2 3 2 2
3
1 4
2 4
1 5
输出
3
2
3
思路
本题目看似花哨其实核心很简单,从输入输出开始看。
第一行:n,m。看了n次,有m朵花;
第二行:n个数,表示每次看到的是哪一朵;
第三行:常见的表达有几组数据的Q;
后面的Q行:起始点和终点,l,r。
也就是说题目其实是说要找一个列表里从第l个数到第r个数之间不重复的数有多少个,这里想到的是首先选取列表中的数,使用集合set()做一个python里的强制类型转换求取所得set的长度即可。
然而发现还是老问题时间复杂度过大不明白为什么又没通过最终结果。
代码
n,m = tuple(list(map(int,input().split())))
flower = list(map(int,input().split()))
Q = int(input())
for i in range(Q):
l,r = tuple(list(map(int,input().split())))
res = flower[l-1:r]
print(len(set(res)))
'''
您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为86.67%
'''
目前博主并没有找出合适的优化方法。