首页 > 编程语言 > 详细

面试题29:数组中出现次数超过一半的数字

时间:2016-07-11 00:37:56      阅读:258      评论:0      收藏:0      [点我收藏+]

O(n)的解法:

考虑在遍历数组的时候保存两个值:一个是数组中的一个数字,一个是次数。当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加1。如果下一个数字和我们之前保存的数字不同,则次数减1。如果次数为零,我们需要保存下一个数字,并把次数设为1。由于我们要找的数字出现的次数比其他所有数字出现的次数之和还要多,那么要找的数字肯定是最后一次把次数设为1时对应的数字。

原理就是如果确实存在出现次数超过一半的数字,那么他出现的次数一定可以抵消掉没有其他数字出现的次数。当然如果输入的例子不对也可能通过,所以最后需要检查

 1 bool g_bInputInvalid = false;
 2 
 3 bool CheckInvalidArray(int* numbers, int length)
 4 {
 5     g_bInputInvalid = false;
 6     if(numbers == NULL && length <= 0)
 7         g_bInputInvalid = true;
 8 
 9     return g_bInputInvalid;
10 }
11 
12 bool CheckMoreThanHalf(int* numbers, int length, int number)
13 {
14     int times = 0;
15     for(int i = 0; i < length; ++i)
16     {
17         if(numbers[i] == number)
18             times++;
19     }
20 
21     bool isMoreThanHalf = true;
22     if(times * 2 <= length)
23     {
24         g_bInputInvalid = true;
25         isMoreThanHalf = false;
26     }
27 
28     return isMoreThanHalf;
29 }
30 
31 int MoreThanHalfNum_Solution2(int* numbers, int length)
32 {
33     if(CheckInvalidArray(numbers, length))
34         return 0;
35  
36     int result = numbers[0];
37     int times = 1;
38     for(int i = 1; i < length; ++i)
39     {
40         if(times == 0)
41         {
42             result = numbers[i];
43             times = 1;
44         }
45         else if(numbers[i] == result)
46             times++;
47         else
48             times--;
49     }
50  
51     if(!CheckMoreThanHalf(numbers, length, result))
52         result = 0;
53  
54     return result;
55 }

 

面试题29:数组中出现次数超过一半的数字

原文:http://www.cnblogs.com/raichen/p/5655438.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!