数组中出现次数超过一半的数字
题目链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/mian-shi-ti-39-shu-zu-zhong-chu-xian-ci-shu-chao-3/
思路:记录摩尔投票法的思路。每次当vote = 0时假设当前的num就是目标数字,并基于以下两个invariant:
- 若目标数字vote++,其他数字vote—,则最后vote必然>0
- 若前n个数的vote = 0,则剩余部分数字的vote依然>0,也就是说目标数字不会发生变化
简单来说,就是目标数字与其他数字一一抵消,最后剩下的必然还是目标数字。
参考代码:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int vote = 0;
int num;
for (int i = 0; i < nums.size(); ++i) {
if (vote == 0) {
num = nums[i];
++vote;
continue;
}
if (nums[i] == num) {
++vote;
}
else {
--vote;
}
}
return num;
}
};