码迷,mamicode.com
首页 > 编程语言 > 详细

在数组中寻找主要元素

时间:2016-09-25 11:57:55      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

来自:《数据结构与算法分析——C语言描述》练习2.19

问题描述:

大小为N的数组A,其主要元素是一个出现次数超过N/2的元素(从而这样的元素最多有一个)。例如,数组

3,3,4,2,4,4,2,4,4 有一个主要元素4,而数组

3,3,4,2,4,4,2,4 没有主要元素。

题目给了一种递归的算法,不过不太理解。看了几位前辈的代码之后换了思路。下面是我的理解:

第一步,寻找候选元素。遍历数组元素,获得第一个元素将其写入ele,标记为1;接下来访问下一元素,如果它与ele相等,标记+1,否则-1。当ele减小到0时,继续读入下一元素到ele,并将标记重设为1。继续下去,直到最后一个元素。此时,ele获得出现次数最多的元素。

第二步,确定该元素是否主要元素。这个不难,用计数器统计该元素在数组中的出现次数count。如果count超过半个数组大小,该候选元素就是主要元素,返回即可;否则返回NOTFOUND。

时间复杂度显然是O(N)。

 1 int findCandidate(const int A[], int N)
 2 {
 3     int i, mark, ele;
 4 
 5     mark = 0;
 6     for (i = 0; i < N; i++)
 7     {
 8         if (mark == 0)
 9         {
10             mark = 1;
11             ele = A[i];
12         }
13         else if (A[i] == ele)
14             mark++;
15         else
16             mark--;
17     }
18     return ele;
19 
20 }
21 
22 int findMajority(const int A[], int N)
23 {
24     int ele, i, count;
25 
26     count = 0;
27     ele = findCandidate(A, N);
28     for (i = 0; i < N; i++)
29     if (A[i] == ele)
30         count++;
31     if (count > N / 2)
32         return ele;
33     return NOTFOUND;    //NOTFOUND is -1
34 }

 

在数组中寻找主要元素

标签:

原文地址:http://www.cnblogs.com/mingc/p/5901717.html

(0)
(2)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!