这个题目我感觉我想到了一个大部分人都没想到的方法,很开心。
题目要求是输入n个数,在输入第i个数的时候输出前面出现频率最大的前k个数。
这个题目一开始用sort排序,有两个点怎么写都超时,后来看了一些网上的解答,都用了set内部排序,需要重载<。
在我快要放弃的时候,再看一遍题目,发现了一个点,题目说K<=10,这个就很关键了,说明我可以用sort,但是可以大大降低sort的元素个数由于每次对一个新的a[i],都要排序,实际上做了大量无意义的排序,前一轮的结果是可以继续用的,那么在我代码里面的数组v的size小于k的时候尽管push,但是如果要放第k+1个了,sort以后把尾元素pop掉,这样一来,每轮sort需要排序的元素都不超过k+1个,大大节省了时间。
这个方法很取巧,如果k很大可能就不适用了,但是依然很开心我想到了这点。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> v;
const int maxn = 50010;
int a[maxn]; //存放序列
int cnt[maxn]; //记录每个元素出现次数
bool flag[maxn]