题目简述
下面是题目完整描述,看着好像复杂,还加了张这么吓人的图片!让人不自主地为仙女们感到担忧 ,其实关键信息就一排文字…
输入一个长度为N的数组,输入M组测试数据,输出每一组测试数据不大于该数组中的多少个数字?
T
i
m
e
L
i
m
i
t
:
1000
m
s
.
Time Limit:1000ms.
TimeLimit:1000ms.
题目链接
题解
我直接用遍历的思路写了,这样时间复杂度为
O
(
M
N
)
O(MN)
O(MN),
O
J
OJ
OJ反馈是
T
L
E
.
TLE.
TLE.
所以要把时间复杂度降到
O
(
n
)
.
O(n).
O(n).一次最多用一重循环搞定,想到用
h
a
s
h
hash
hash排序算法先排序,因为这样可以一重循环排好序,并且在数组中存储的数是该下标的个数(哈希排序的知识),然后就很方便地构造出一个答案与数组的映射关系,最后以复杂度
O
(
n
)
O(n)
O(n)直接输出结果即可。
代码
#include<bits/stdc++.h>
#define maxN 100001
using namespace std;
int main(){
int N,M,num,hash[maxN],cnt,i,j,h;
cin>>N>>M;
memset(hash,0,sizeof(hash));
for(i=1;i<=N;i++){
cin>>num;
hash[num]++;
}
/*中间这一段是用于测试哈希排序结果
cnt=0;
for(i=1;i<=maxN;i++){
for(j=1;j<=hash[i];j++){
cout<<i<<" ";
cnt++;
if(cnt==N) break;
}
if(cnt==N) break;
}*/
for(i=maxN-2;i>=1;i--){
hash[i]=hash[i]+hash[i+1];//想清楚hash数组中存的是某个数(对应到下标)的数量
}
for(i=1;i<=M;i++){
cin>>h;
cout<<hash[h]<<endl;
}
return 0;
}
输出示例
5 3
1 2 3 4 5
2
4
4
2
6
0