问题描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解法一:
通过map统计每个数字出现的次数,借助了辅助空间,空间复杂度不是最优的
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int len=numbers.size();
if(len==0){
return 0;
}
map<int,int> m;
int count=0;
for(int i=0;i<len;i++){
count=++m[numbers[i]]; //map以numbers[i]这个元素的值作为索引(Key)建立了key-value映射表,++操作相当于给表的value加一,如果这个值大于总数的一半就退出
if(count>len/2) return numbers[i];
}
return 0;
}
};
解法二:
在遍历数组的时候,保存两个值,一个是数组中的数字,另一个是次数,当遍历到下一个数字的时候,如果和上一次的数字一样则次数加1,如果不一样次数减一(相当于抵消了),如果次数为0了,那就保存下一个数字,并把次数设置为1,因为我们要找的数字如果存在最后一定是把次数设置为1的那个数。
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int len=numbers.size();
if(len==0){
return 0;
}
int count=0;
int theone;
for(int i=0;i<len;i++){
if(count==0){
theone=numbers[i];
count=1;
}
else{
if(theone==numbers[i]){
count++;
}
else{
count--;
}
}
}
int num=0;
for(int i=0;i<len;i++){
if(theone==numbers[i])
num++;
}
return (num>len/2)?theone:0;
}
};