一、问题描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
二、思路
快排算法中的patition算法,返回中间的数即可。但要注意有可能数组中没有出现,此时我们需要对数组中间的数字验证:
int num = numbers[numbers.size() / 2];
int count = 0;
for (int k = 0; k < numbers.size(); k++) {
if (numbers[k] == num) count++;
}
if (count * 2 > numbers.size()) return num;
else return 0;
如果这个数出现超过数组长度的一半,返回这个数,如果不超过数组长度的一半,则返回0.
三、代码
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.size() == 0) return 0;
else if(numbers.size() == 1 || numbers.size() == 2) return numbers[0];
int x = numbers[numbers.size() - 1];
int i = -1;
for(int j = 0; j < numbers.size();++j){
if(numbers[j] <= x){
++i;
swap(numbers[i],numbers[j]);
}
}
swap(numbers[numbers.size() - 1],numbers[i + 1]);
int num = numbers[numbers.size() / 2];
int count = 0;
for (int k = 0; k < numbers.size(); k++) {
if (numbers[k] == num) count++;
}
if (count * 2 > numbers.size()) return num;
else return 0;
}
};