题目是这样的:下面是我自己给出的代码
#include<iostream>
#include<map>
using namespace std;
int main(void)
{
int I_num;
int I_tem;
map <int,int> M_find;
cout<<"input the number:";
cin>>I_num;
for(int i=0;i<I_num;i++)
{
cin>>I_tem;
pair<map<int,int>::iterator,bool> P_flg=M_find.insert(make_pair(I_tem,1));
if(!P_flg.second)
++P_flg.first->second;
}
map<int,int>::iterator M_tem=M_find.begin();
map<int,int>::iterator M_beg =M_find.begin();
while (M_beg !=M_find.end())
{
if((M_beg->second)>(M_tem->second))
M_tem=M_beg;
else if((M_beg->second)==(M_tem->second))
{
if((M_beg->first)<(M_tem->first))
M_tem=M_beg;
}
++M_beg;
}
cout<<"the most times gets: "<<M_tem->first<<endl;
return 0;
}
这段代码能够正确完成题目的要求,并且个人感觉考虑到了对(查找,插入)时间复杂度和内存空间复杂度最优解。
刚看到题目时,我觉的应该用数组存储数,然后每插入一个检查有没有存在,并给相应的位加1.
但是数组是静态的,如果要输入1000个数的话,就需要申请1000*int的大小内存,但如果有999个数相同,就会产生大量内存浪费,但时间复杂度是O(1)。
于是想到了容器,动态数组。但是每插入一个数都要对已经插入的数做一遍扫描,这个时间复杂度是O(n);但空间复杂度相比上面情况就好很多。
当然这里如果使用动态内存分配链表,情况会和vector 容器一样。
考虑了上面所有情况,我使用了 map ( 树形存储模式)
既可以做到 空间上的最优,并且能将时间复杂度降低到O(log N);
空间上达到和链表相同的最低复杂度,时间上树形查找时间复杂度优于线性查找。