九度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 }

 

posted @ 2016-08-26 14:00  Jason杰  阅读(217)  评论(0编辑  收藏  举报