数组中出现次数超过一半的数字
时间限制: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的评判系统丫的严啊~所以不要太轻易怀疑自己,还有当实在没辙的时候,想想一些简单的,哪怕是蛮力的方法。。。
毕