基础题练习——数组中出现次数超过一半的数字
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]
相关文章推荐
- 数据结构练习(35)数组中出现次数超过一半的数字
- 求数组中出现次数超过一半的数字
- 剑指offer系列之27:数组中出现次数超过一半的数字
- 程序员面试题精选100题(47)-数组中出现次数超过一半的数字[算法]
- 程序员面试题精选100题(47)-数组中出现次数超过一半的数字
- 基于partition——最小的K个数、数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 面试题:数组中出现次数超过一半的数字
- 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数
- 数组中出现次数超过一半的数字
- 29-数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 寻找数组中出现次数超过一半的数字
- 面试题29 数组中出现次数超过一半的数字
- 程序员面试题精选100题(47)-数组中出现次数超过一半的数字[算法]
- 数组中出现次数超过一半的数字
- 剑指offer-29 数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 码农小汪-剑指Offer之26 -数组中出现次数超过一半的数字
- 算法题——数组中出现次数超过一半的数字