九度oj 题目1370:数组中出现次数超过一半的数字
- 题目描述:
-
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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 <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 6 using namespace std; 7 int n; 8 int num[100002]; 9 10 int cmp(const void *a, const void *b) { 11 int at = *(int *)a; 12 int bt = *(int *)b;; 13 return at - bt; 14 } 15 int main(int argc, char const *argv[]) 16 { 17 //freopen("input.txt","r",stdin); 18 while(scanf("%d",&n) != EOF) { 19 for(int i = 0; i < n; i++) { 20 scanf("%d",&num[i]); 21 } 22 qsort(num, n, sizeof(int), cmp); 23 int cnt = 1; 24 int pan = n/2; 25 bool isFind = false; 26 for(int i = 1; i < n; i++) { 27 if(num[i] == num[i-1]) { 28 cnt++; 29 if(cnt > pan) { 30 printf("%d\n",num[i]); 31 isFind = true; 32 break; 33 } 34 } 35 else { 36 cnt = 1; 37 } 38 } 39 if(!isFind) { 40 puts("-1"); 41 } 42 } 43 return 0; 44 }
没有考虑到n == 1时情况,出错
修改如下
1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 6 using namespace std; 7 int n; 8 int num[100002]; 9 10 int cmp(const void *a, const void *b) { 11 int at = *(int *)a; 12 int bt = *(int *)b;; 13 return at > bt; 14 } 15 int main(int argc, char const *argv[]) 16 { 17 //freopen("input.txt","r",stdin); 18 while(scanf("%d",&n) != EOF) { 19 for(int i = 0; i < n; i++) { 20 scanf("%d",&num[i]); 21 } 22 qsort(num, n, sizeof(int), cmp); 23 double cnt = 1; 24 double pan = n/2; 25 bool isFind = false; 26 int ans = num[0]; 27 for(int i = 1; i < n; i++) { 28 if(num[i] == num[i-1]) { 29 cnt++; 30 if(cnt > pan) { 31 ans = num[i]; 32 break; 33 } 34 } 35 else { 36 cnt = 1; 37 } 38 } 39 if(cnt > pan) { 40 printf("%d\n",ans); 41 } 42 else { 43 puts("-1"); 44 } 45 } 46 return 0; 47 }
由于超过一半,所以如果存在这样的数,排好序后num[n/2]就是该数
本来以为下面代码会更快,没想到居然变慢了
1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 6 using namespace std; 7 int n; 8 int num[100002]; 9 10 int cmp(const void *a, const void *b) { 11 int at = *(int *)a; 12 int bt = *(int *)b;; 13 return at > bt; 14 } 15 int main(int argc, char const *argv[]) 16 { 17 //freopen("input.txt","r",stdin); 18 while(scanf("%d",&n) != EOF) { 19 for(int i = 0; i < n; i++) { 20 scanf("%d",&num[i]); 21 } 22 qsort(num, n, sizeof(int), cmp); 23 24 int pan = n/2; 25 int cnt = 0; 26 for(int i = 0; i < n; i++) { 27 if(num[i] == num[pan]) { 28 cnt++; 29 if(cnt > pan) { 30 break; 31 } 32 } 33 } 34 if(cnt > pan) { 35 printf("%d\n",num[pan]); 36 } 37 else { 38 puts("-1"); 39 } 40 } 41 return 0; 42 }