楼上的方法不能说不对,不过 , 这个问题是有经典算法的: 先举个例子吧:2 3 4 4 5 5 4 4 4上面这个数列 , 4 明显是要找的数 。 因为4的个数占了整堆数字的一半以上 , 所以我们可以把数列分为下面几对:2 4 3 4 5 4 5 4 4这样每对都有一个4 , 最后还剩下4 , 说明 4 就是我们要找的数 ,算法的思想就是,不停的消去数字对 , 最后剩下的数 , 就是要找的数字。 所以算法的伪代码如下: (1)计数器count置1,另c=A[1]; (2)从A[2]开始向后扫描,for j=2 to n 若a[j]与c相等,则count++; 若a[j]与c不等,则count— 若count==0,则对A[j+1...n]寻找多数元素候选者。 int Candidate(int A[],int m ,int n) {//寻找A[m...n]中多数元素候选者 c=A[m];count=1; for(j=m+1;j<n&&count>0) { if(A[j]==c) count++ else count--; } if(j==n)return c; else return canditate(A, j+1 , n); //对则对A[j+1...n]寻找多数元素候 选者。 }具体的参考: 《算法设计技巧与分析》 p98
楼上的方法不能说不对,不过 , 这个问题是有经典算法的:
先举个例子吧:
上面这个数列 , 4 明显是要找的数 。 因为4的个数占了整堆数字的一半以上 , 所以我们可以把数列分为下面几对:
这样每对都有一个4 , 最后还剩下4 , 说明 4 就是我们要找的数 ,算法的思想就是,不停的消去数字对 , 最后剩下的数 , 就是要找的数字。
所以算法的伪代码如下:
具体的参考: 《算法设计技巧与分析》 p98