Shirlies
宁静专注认真的程序媛~

题目:

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

链接:

http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路:

神奇的一道题,思路完全来自剑指offer。

一个数的个数要超过数组的一半,即其个数大于len/2,那么其他数的总个数要小于这个数的总个数,一对一消除后,最后的个数肯定要大于0(肯定会有不小于2的这个数是连续出现的)

如果存在这个数,一对一消除后得到的数必然为此数,但是考虑到可能不存在这个数,那么最后遍历一次数组,判断这个数的个数是否真大于len/2

用快排的方法也可以解决,就是排序的数正好在中间的时候,就是这个数了(如果存在的话),不存在的话,遍历一次统计次数即可。

代码:

 1 class Solution {
 2 public:
 3     int MoreThanHalfNum_Solution(vector<int> numbers) {
 4         int len = numbers.size();
 5         if(len < 1){
 6             return 0;
 7         }
 8         
 9         if(len == 1){
10             return numbers[0];
11         }
12         
13         int num = numbers[0];
14         int cnt = 1;
15         for(int index = 1; index < len; ++ index){
16             if(cnt == 0){
17                 num = numbers[index];
18             }
19             
20             if(numbers[index] == num){
21                 ++ cnt;
22             }else{
23                 -- cnt;
24             }
25         }
26         
27         if(cnt == 0){
28             return 0;
29         }
30         cnt = 0;
31         for(int index = 0; index < len; ++ index){
32             if(numbers[index] == num){
33                 ++ cnt;
34             }
35         }
36         
37         return cnt > (len >> 1) ? num : 0;
38     }
39 };

 

posted on 2016-09-05 12:37  Shirlies  阅读(264)  评论(0)    收藏  举报