数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
思路:
数组中有一个数出现的次数超过数组长度的一半,设这个数为a,其他数为b、c、d...。设time[x]表示x出现的次数,则time[a] > time[b]+time[c]+time[d]+...。time[a]-(time[b]+time[c]+time[d]+...) > 0。time[a]-time[b]-time[c]-time[d]-... > 0。从左往右遍历数组,用一个变量表示当前数cur,一个变量表示当前数出现的次数time。当数组中出现和cur相同的数时,time加一,不同时,time减一。遍历完数组后,cur就是答案
代码:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int length = nums.size();
if(length == 0) {
return 0;
}
int cur = nums[0];
int time = 1;
for(int i = 1;i < length;i++) {
if(nums[i] == cur) {
time++;
}
else if(--time < 0) {
cur = nums[i];
time = 1;
}
}
return cur;
}
};