Loading

求数组主元素的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 }
posted @ 2020-04-08 19:15  拾月凄辰  阅读(585)  评论(0编辑  收藏  举报