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

时间限制:1 秒内存限制:32 兆特殊判题:

题目描述:

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

输入:

每个测试案例包括2行:

第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数。

第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]。 

输出:

对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1。 

样例输入:
9
1 2 3 2 2 2 5 4 2
样例输出:
2
 1 #include <iostream>
 2 #include <stdio.h>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n;    
 8     int i;    
 9     
10     int arr[100001];
11     int k;
12     int cnt;
13     
14     
15     while(scanf("%d",&n)==1)
16     {    
17         cnt = 0;    
18         for (i=0; i<n; i++)
19         {
20             scanf("%d", &arr[i]);
21             
22             if (cnt==0)
23             {
24                 k = arr[i];
25                 cnt ++;
26             }
27             else 
28             {
29                 if ( k ==arr[i])
30                 {
31                     cnt++;
32                 }
33                 else
34                 {
35                     cnt--;
36                 }
37             }
38             
39         }
40 
41         cnt =0 ;
42         for(i=0; i<n; i++)
43         {
44             if (arr[i]==k)
45             {
46                 cnt++;
47             }
48             
49         }
50         if (cnt> n/2)
51         {
52             printf("%d\n", k);
53         }
54         else
55         {
56             printf("-1\n");
57         }
58     }
59     return 0;
60 }

太坑了!!先是纠结很久怎么区分没有出现一半元素的情况。总想会有一个特别高效的或是特别巧的方法。结果怎么也想不到,就干脆在多扫描一次好了。Not Accept!各种乱猜乱想,hold不住了,直接找答案。。结果基本是一致的。就是我使用了unsigned int类型,手贱,想用个范围大的总不会错吧!!错,就在这错鸟,不带这么坑的啊~~%>_<%~~

结论:acm的评判系统丫的严啊~所以不要太轻易怀疑自己,还有当实在没辙的时候,想想一些简单的,哪怕是蛮力的方法。。。

posted @ 2013-03-30 11:36  legendmaner  阅读(203)  评论(0编辑  收藏  举报