题目链接
题目描述
给出n个数,找到其中的众数,保证有且仅有一个。
要求
时间复杂度:O(n), 空间复杂度:O(1)
思路
-
首先想到的还是哈希表,但是空间复杂度。。不可能用哈希。
-
核心思想:对拼消耗,就像玩卡牌游戏一样。
把相同的元素看作一个集合,这个集合就像是一个玩家的牌库。
两个不同的元素会的抵消,最后剩下个的元素就是众数。 -
过程:遍历数组,判断计数器。
计数器为0时,更新ans为当前元素,计数器+1。
计数器不为0时,若当前元素与ans相同,计数器+1,否则计数器-1,
最后ans的值为众数。
C++方法
class Solution {
public:
int majorityElement(vector<int>& nums) {
int cnt = 0;
int ans = 0;
for(int i = 0; i < nums.size(); i++) {
if (cnt == 0) {
cnt ++;
ans = nums[i];
}
else if (nums[i] == ans)
cnt ++;
else
cnt--;
}
return ans;
}
};