多数元素
多数元素
题目描述:
给定一个大小为n的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于\(\lfloor n/2\rfloor\)的元素。
你可以假设数组是非空的,并且给定数组总是存在多数元素。
示例1:
输入:[3,2,3]
输出:3
示例2:
输入:[2,2,1,1,1,2,2]
输出:2
tips:要求时间复杂度O(n),空间复杂度O(1)
Solution:
方法1:随机化
每次随机的选取数组中的一个数,统计数量,直到找到过半的数。(期望时间复杂度为O(n),空间复杂度O(1))
Code:
class Solution {
public:
int majorityElement(vector<int>& nums) {
while(true) {
int k = rand() % nums.size();
int cnt = 0;
for(auto e:nums) {
if(nums[k] == e) cnt++;
}
if(cnt > nums.size() / 2) return nums[k];
}
}
};
方法2:Boyer-Moore投票算法
设置 candidate变量记录可能为众数的值,count记录该数出现次数,遍历数组
对于x:如果x等于candidate,则count+1;如果不等于candidate,则count-1,当count=0是candidate更新为x,最终candidate的值即为众数。
Code:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate, count = 0;
for(auto e:nums) {
if(count) {
count += (candidate == e ? 1 : -1);
}
else {
candidate = e;
count++;
}
}
return candidate;
}
};