算法题目来自于书籍《编程之美》,描述如下:
论坛中有人老是发水帖,现在管理员要通过某种方法把这个水贴大王找出来,请设计一个可行的算法。
首先第一个想到的就是遍历了,每遇到一个ID便将ID记录下来,并且count++;这是一个时间、空间复杂度都很大的一个算法,差评。
书上给了新的算法,算法的设计思想在于:每次删除两个不同的ID,删除之后剩下的水王的ID依然会大于总数的一半,这就意味着可以将问题分解,分解为一些小问题来解决,C++实现如下:
#include<iostream>
using namespace std;
int find(int ID[], int n)
{
int sw;
int count;
for(int i=0;i<n;i++){
if(count==0){
sw=ID[i];
count++;
}
else{
if(sw == ID[i]) count++;
else count--;
}
}
return sw;
}
int main()
{
int arr[] = {1, 2, 3, 4, 2, 5, 2, 2, 3, 2, 5, 2};
printf("over harf id is %d\n", find(arr, 12));
system("pause");
return 0;
}