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 ",D); } return 0; }