力扣-169-多数元素

直达链接

最直接的做法是扫一遍,统计每个数字出现的次数,可以用hashmap

怎么获取hashmap中值最大的元素?

可以排序,然后双指针滑动窗口,保存最大长度和对应的数字
…算是时间复杂度O(N),空间O(1)吧

class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(), nums.end());
int i = 0, major = nums[0], frequency = 1,maxFrequency =1;
for (int j = 1; j < nums.size() - 1; j++) {
if (nums[j] == nums[i]) frequency++;
else {
frequency = 1;// 重新计数长度
i = j;// 重置左指针
}
if (frequency > maxFrequency) {
maxFrequency = frequency;
major = nums[i];
}
}
return major;
}
};

我想用双指针,但是似乎哪里出问题了,在最后一个窗口,即当遍历到数组的最后一个元素时,没能妥善更新major

官方题解

哈希表

统计各数字出现次数,并用两个变量保存出现最多的元素和最多出现次数

// 时间复杂度一次遍历O(N),空间复杂度O(n)
int majorityElement(vector<int>& nums) {
unordered_map<int, int> counts;
// 分别用于记录最大元素值和最大出现次数
int marjority = 0, count = 0;
// 遍历整个数组,对其中元素出现次数进行计数
for (int num : nums) {
++counts[num];
// 用一个变量来保存最大的出现次数
// 当某元素出现次数大于这个值时,就更新,同时记录最大元素是谁
if (counts[num] > count) {
marjority = num;
count = counts[num];
}
}
return marjority;
}

排序

因为多数元素出现次数大于n/2,所以排序后下标为n/2的元素一定是marjority

如果自己编写堆排序,可以达到O(1)空间复杂度

这样看来排序之后还不用像我想的一样滑动窗口了

分治

用类似归并排序的思想来找众数,感觉一下子复杂了好多…这不是正常人会做的吧

投票算法

必须是出现次数大于n/2才能这么做

class Solution {
public:
// 投票算法
int majorityElement(vector<int>& nums) {
// 准备一个候选人和他的票数记录
int candidate = nums[0], count = 1;
// 遍历整个数组,与候选人一致就+1,否则减一
for (int i = 1; i < nums.size(); i++) {
if (nums[i] == candidate) count++;
else count--;
// 如果票数归零,就换人,并且重新开始计票
if (!count) {
candidate = nums[i];
count = 1;
}
}
return candidate;
}
};

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16665821.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(33)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起