寻找主元素

主元素这个问题,有个nlogn的算法,但是还有比它更快的,有O(n)的算法,基本思想是,从头到尾遍历,先将第一个元素保存到一个变量中,然后依次往后遍历,每遍历到与它的值相同的元素时,就要将它的个数+1, 不同时-1, 这样是因为如果存在主元素,那么主元素的个数一定是大于n/2的,所以最后这样抵消下来剩下的一定是主元素,如果判断它不存在呢,就需要再遍历一遍,看最后找到的这个是不是主元素,其中有个细节就是当那个保存的个数减到0的时候怎么办,如果减到零,就让它等于当前遍历到的这个元素,代码如下,

 1 #include <stdio.h>
 2 const int N = 1000;
 3 int a[N];
 4 
 5 int main()
 6 {
 7     int n;
 8     while (~scanf("%d", &n))
 9     {
10         for (int i = 0; i < n; i++)
11             scanf("%d", &a[i]);
12             
13         int cur_value = a[0], cur_count = 1;/*cur_value用来保存当前容器中的值,
14         cur_count表示当前值为cur_value的个数 */
15         for (int i = 1; i < n; i++)
16         {
17             if (cur_count == 0)//如果抵消完,将它的值改成当前遍历到元素的值 
18             {
19                 cur_count = 1;
20                 cur_value = a[i];
21             }
22             else
23             {
24                 if (cur_value == a[i])//如果相等,就++ 
25                 {
26                     cur_count++;
27                 }
28                 else//不等,就-- 
29                     cur_count--;
30             }
31         }
32         int cnt = 0;
33         for (int i = 0; i < n; i++)//判断是否存在主元素 
34             if (cur_value == a[i])
35                 cnt++;
36         if (cnt > n / 2)
37             printf("%d\n", cur_value);
38         else
39             puts("NO");
40     }
41     
42     
43     return 0;
44 }

 

posted @ 2014-12-07 21:20  Howe_Young  阅读(1824)  评论(0编辑  收藏  举报