求数组主元素的O(n)算法
定义
在一个规模为N的数组A[N]中,所谓主元素就是出现次数大于N/2的元素,例如 3.3.4.2.4.4.2.4.4 有一个主元素为4。
充分利用主元素的出现次数大于N/2这个已知条件,因为主元素的出现次数大于N/2,所以容易证明下面的解法是正确的:
首先假设主元素是X,则遍历数组时出现与X相等的元素时,X出现的数目+1,不相等时,如果计数值变为1,则这个X可能不是主元素,需要将假定值更改为新出现的元素,计数值不为1时,则X出现的数目-1.遍历完后的X就是主元素的可能值。复杂度为O(n)。
其代码如下:
1 #include <iostream> 2 3 using namespace std; 4 5 int get(int A[], int n) 6 { 7 int result, cnt; 8 result = A[0]; 9 cnt = 1; 10 for(int i=1; i<n; i++) 11 { 12 if(A[i] == result) 13 cnt++; 14 else if(cnt == 1) 15 { 16 result = A[i]; 17 cnt = 1; 18 } 19 else 20 cnt--; 21 } 22 cnt=0; 23 for(int i=0; i<n; i++) 24 { 25 if(A[i]==result) 26 cnt++; 27 } 28 29 if(cnt>(n/2)) 30 return result; 31 else 32 return -1; 33 } 34 35 36 int main() 37 { 38 int a[9] = {4,1,4,2,4,3,4,4,5}; 39 cout << get(a, 9); 40 41 42 return 0; 43 }