LeetCode 简单题目,记录一下
已知一组数中有一个数占超过半数以上,求出这个数是什么?
该算法的步骤是:首先选定第一个数作为“疑似众数”,设定计数器为1。然后往后遍历,当碰到相同的数,计数器加1,否则减去1。当计数器等于 0 时,重新选择下一个数为疑似众数,直到遍历完全部数。最终的疑似众数便是所需答案。
解释如下:分两种情况考虑,第一,选中了众数本身,则由于众数的数量比其余的数字加起来都要多,所以即时中途被停止了,也只是减去等量的众数和其他数,对最终结果不影响。第二,选中了其他的数字,此时减去等量的 其他数B 和(众数加上除了B以外的其他数),由于其他数B占比较少,所以一定会在中途计数器等于0。此时删除了更多的其他数:其他数B = 除了B以外的其他数 + 众数 >> 其他数B + 除了B以外的其他数 > 众数 , 故剩下的众数数量更加多,因此对结果没有影响。
下面给出 C++ 代码:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int major = nums[0];
int count = 1;
for(int i = 1;i < nums.size(); i++){
if(count != 0){
if(nums[i] != major) count--;
else count++;
}
else{
major = nums[i];
count++;
}
}
return major;
}
};
网友评论