课堂练习——寻找水王
思路1:因为各个人的id号大小不同,因此可将所有人的id号按照从小到大的顺序进行排序,用快速排序法,时间复杂度为:O(N*logN)。然后遍历整个数组,统计每个id号出现的次数,出现次数超过一半的id号即为所求。总的时间复杂度为O(N*logN+N)。
思路2:因为知道前提是水王发帖数目超过总发帖数目的一半,因此,将所有id号从小到大排序完成后,只要找到位于数组中间的id号,肯定为水王的id号。此时时间复杂度缩小到O(N*logN)。
思路3:可以采用我们平时玩的手机游戏小星星的思路,如果上下两个相邻的id号不同,则将其消去,因为水王发帖数目超过总帖数的一半,
因此水王的id号必定前后相邻。这样时间复杂度为O(N).
三,代码
#include <iostream>
using namespace std;
int shuiwang(int arr[], int length)
{
int result = arr[0];
int t = 1;
for(int i = 1; i < length; ++i)
{
if(arr[i] == result)
t++;
else
t--;
if(t == 0)
{
result = arr[i];
t = 1;
}
}
t = 0;
for(i = 0; i < length; ++i)
{
if(arr[i] == result)
t++;
}
return result;
}
int main()
{
int a[10]={3,2,3,1,2,3,3,3,7,3};
int* n=a;
cout<<"水王的id号为:"<<shuiwang(a,9)<<endl;
return 0;
}
四,实验结果
五,总结
课上自己想到的只有第一种思路,后来有同学提出第二种思路,最后 处于程序代码优化的考虑,老师为我们提供了第三种思路。通过老师和同学的帮助,最终完成了本次实验,在以后的实验中要扩宽自己的思路