数组中出现次数超过一半的数字

题:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

思路:常规思路是先排序,(若有)取中间值即可,时间复杂度为O(nlogn)。定义两个变量,一个是数组中的一个数cur,一个为次数times。遍历到下一个数时,若这之前保存的数相同,则次数加1,若不同则见,若本次比较中times为0,则更新cur,同时times置1。最后若有超过数组长度一半的元素,则返回cur,没有则返回0,对于是否有,则只需再次遍历数组找到等于cur的个数,若个数超过数组一半,则有,否则没有。时间复杂度为O(n)。

代码如下:

 1 class Solution {
 2 public:
 3     int MoreThanHalfNum_Solution(vector<int> numbers) 
 4     {
 5         if(numbers.empty()) return 0;
 6         int cur=numbers[0];
 7         int times=1;
 8         int len=numbers.size();
 9         for(int i=1;i<numbers.size();++i)
10         {
11             if(times==0)
12             {
13                 cur=numbers[i];
14                 times=1;
15             }
16             else if(cur==numbers[i])
17                 times++;
18             else
19                 times--;
20         }
21         int totalRep=0;
22         for(int i=0;i<len;++i)
23         {
24             if(numbers[i]==cur)
25                 totalRep++;
26         }
27         if(totalRep<=len/2)
28             return 0;
29         return cur;
30     }
31 };

注意要加上最后的判断。

posted @ 2017-08-15 10:46  王大咩的图书馆  阅读(198)  评论(0编辑  收藏  举报