难度:简单。
标签:数组,计数。
要求设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。
看题解,采用Boyer-Moore 投票算法。
维护一个candidate和count,开始count为0.
遍历数组,若count = 0,则将当前值x赋给candidate,若当前值x=candidate,则count+1,不等于count-1.
遍历完数组,若有主要元素,即为candidate,若没有,candidate值不确定。
因此最后在遍历一次数组,计算candidate出现的次数。
正确解法:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int n = nums.size();
int candidate = 0, count = 0;
for(int i = 0; i < n; ++i){
if(count == 0)candidate = nums[i];
if(candidate == nums[i])count++;
else count--;
}
int m = 0;
for(int i = 0; i < n; ++i){
if(nums[i] == candidate)m++;
}
if(n / 2 + 1 > m)return -1;
return candidate;
}
};
结果: