力扣-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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步