pro:给定N个数的数组a[],其中一个数X的出现次数大于N/2,求X,空间很小。

sol:不能用保存数组,考虑其他做法。 由于出现次数较多,我们维护一个栈,栈中的数字相同,所以我们记录栈的元素和个数即可,如果新加入一个数与栈中数不同,则弹出一个元素(tot--),否则加入,最后保留在栈中的就是答案。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int D,tot,x,N;
int main()
{
    while(~scanf("%d",&N)&&N){
        tot=0;
        rep(i,1,N) {
            scanf("%d",&x);
            if(tot==0) D=x,tot=1;
            else if(D!=x) tot--;
            else tot++;
        }
        printf("%d\n",D);
    }
    return 0;
}

 

It is your time to fight!