您的位置:首页 > 其它

基础题练习——数组中出现次数超过一半的数字

2012-10-07 21:49 148 查看
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。输入:每个测试案例包括2行:第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数。第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]。输出:对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1。样例输入:
91 2 3 2 2 2 5 4 2
样例输出:
2
总结:关键是判断是否存在的问题,灵活点先假设满足条件的数存在就可以使用线性扫描两相异元素消去法或者快速排序取中位数获得candidate value,然后一趟线性扫描统计验证;
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <string>#include <map>#include <assert.h>#include <vector>using namespace std;int num[100000];void FindNum(int n){int currentNum;int ocurrs =0;for(int i=0; i<n; i++){if(ocurrs==0){currentNum=num[i];ocurrs=1;}else{if(num[i]!=currentNum)ocurrs--;elseocurrs++;}}if(ocurrs<=0){cout<<"-1"<<endl;return;}int candidateVal = currentNum;//checkint times=0;for(int i=0; i<n; i++)if(num[i]==candidateVal)times++;if(times>n/2)cout<<candidateVal<<endl;elsecout<<"-1"<<endl;}int main(){//freopen("in.txt","r",stdin);int n;while (cin>>n){for(int i=0; i<n; i++)scanf("%d",num+i);FindNum(n);}return 0;}/**************************************************************Problem: 1370User: xjbscutLanguage: C++Result: AcceptedTime:60 msMemory:1900 kb****************************************************************/
[/code]
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <string>#include <map>#include <assert.h>#include <vector>using namespace std;int num[100000];void FindNum(int n){sort(num,num+n);int candidateVal = num[n/2];//checkint times=0;for(int i=0; i<n; i++)if(num[i]==candidateVal)times++;if(times>n/2)cout<<candidateVal<<endl;elsecout<<"-1"<<endl;}int main(){//freopen("in.txt","r",stdin);int n;while (cin>>n){for(int i=0; i<n; i++)scanf("%d",num+i);FindNum(n);}return 0;}/**************************************************************Problem: 1370User: xjbscutLanguage: C++Result: AcceptedTime:70 msMemory:1900 kb****************************************************************/
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: