ZBLOG

class Solution { public: int majorityElement(vector& nums) { sort(nums.begin(), nums.end()); int max = 0, max_data =0, data = nums[0], number = 0; for(int i=0; i

这段代码是一个 C++ 的解决方案,用于查找数组中出现次数超过一半的元素(众数)。其实现步骤如下:

  1. 排序:首先对输入的数组 nums 进行排序。
  2. 计数:通过遍历已排序的数组,统计每个元素出现的次数,并记录最大出现次数的元素。
  3. 返回结果:最后返回出现次数最多的元素。

不过,这个实现的方法在时间复杂度上并不是最优。下面我提供一种更高效的方法,即使用 Boyer-Moore 投票算法,其时间复杂度为 O(n),空间复杂度为 O(1)。

Boyer-Moore 投票算法实现

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int candidate = nums[0];
        int count = 1;

        for (int i = 1; i < nums.size(); ++i) {
            if (nums[i] == candidate) {
                count++;
            } else {
                count--;
                if (count == 0) {
                    candidate = nums[i];
                    count = 1;
                }
            }
        }

        return candidate;
    }
};

解释:

  • 候选者和计数器:初始化一个候选者(candidate)和一个计数器(count)。
  • 遍历数组
    • 如果当前元素与候选者相同,计数器加一。
    • 如果不同,计数器减一。如果计数器归零,就将当前元素设为新的候选者,并重置计数器为一。
  • 最终结果:由于题目保证了存在众数,最后返回的 candidate 就是答案。

这种方法效率更高且不需要额外空间来存储频率,因此推荐使用。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21777

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?