定义
在一个规模为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 }