例题描述
输入n
个整数,输出出现次数大于等于数组长度一半的数。
- 输入描述:
每个测试输入包含n
个空格分割的n
个整数,n
不超过100
,其中有一个整数出现次数大于等于n/2
。 - 输出描述:
输出出现次数大于等于n/2
的数。
示例1:
- 输入
3 9 3 2 5 6 7 3 2 3 3 3
- 输出
3
思路一
最简单的思路就是排序,然后找中间那个数。但它不是最优的解法。
代码实现
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
vector<int> v;
while(cin >> n){
v.push_back(n);
}
std::sort(v.begin(),v.end());
cout << v[(v.size()/2)-1];
return 0;
}
思路二
O(n)
思想:
因为要找过半的数,用一个变量count
记录读取每个变量变化的次数,一个变量temp
记录可能过半的数。
先让count = 1
,然后让temp = vec[0]
,然后往后遍历一遍。
碰到和temp
相同的数就给count++
,否则就count--
,如果count
变成0
,就让temp=vec[i]
(v
数组遍历过程中的当前值),并让count = 1
。
如此遍历一遍,因为有一个数过半,所以temp
最后肯定存储的是过半的数。
代码实现
#include <vector>
#include <iostream>
using namespace std;
int main(){
int n;
vector <int> v;
while(cin >> n){
v.push_back(n);
}
int count = 1;
int temp = v[0];
for(int i = 1; i < v.size(); ++i){
if(v[i] == temp)
count++;
else
count--;
if(count == 0){
temp = v[i];
count++;
}
}
cout << temp << endl;
return 0;
}