【面试】找到一个数组中超过一半的数——摩尔投票算法

摩尔投票算法

思路

算法首先将数组的第一个元素作为候选众数,并设置初始计数为1。然后,遍历数组中的每个元素,如果当前元素等于候选众数,则增加计数,否则减少计数。当计数降为0时,算法更换候选众数为当前元素,并重置计数。最终,候选众数即为超过一半的数。

原理

这个算法之所以有效,是因为多数元素的出现次数一定超过其他所有元素的出现次数之和。通过不断抵消不同的元素,最终候选众数将是多数元素。

C++实现

cpp 复制代码
#include <iostream>
#include <vector>

int findMajorityElement(std::vector<int>& nums) {
    int majority = nums[0];  // 候选的众数
    int count = 1;           // 候选众数的计数

    for (int i = 1; i < nums.size(); ++i) {
        if (nums[i] == majority) {
            // 如果当前元素等于候选众数,则增加计数
            ++count;
        } else {
            // 如果当前元素不等于候选众数,则减少计数
            --count;
            if (count == 0) {
                // 当计数降为0时,更换候选众数为当前元素
                majority = nums[i];
                count = 1;
            }
        }
    }

    // 最终的候选众数即为超过一半的数
    return majority;
}

int main() {
    std::vector<int> nums = {2, 2, 1, 1, 1, 2, 2};
    int majorityElement = findMajorityElement(nums);
    std::cout << "Majority Element: " << majorityElement << std::endl;
    return 0;
}

复杂度

摩尔投票算法的时间复杂度为O(n),其中n是数组的长度,因为它只需要遍历数组一次。这使得它成为在大型数据集中找到多数元素的高效方法。

相关推荐
Rain的Java大神之路1 小时前
国家数据集团校招、社招都开了:总部雄安,这些技术岗值得认真看看
java·后端·面试
一去不复返的通信er1 小时前
排序 + 双指针:力扣15三数之和
算法·leetcode
Moment1 小时前
为什么这么多 Agent Harness 都选择 TypeScript
前端·后端·面试
Pniubi1 小时前
力扣3无重复字符的最长字串(滑动窗口)
算法·leetcode·职场和发展
On The Road :1 小时前
深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析
jvm·算法
时间的拾荒人2 小时前
CMake 实战指南:从基础语法到静态库/动态库制作与链接
开发语言·c++·面试
微尘hjx2 小时前
【Deep-OC-SORT 03】多轨迹算法Deep-OC-SORT-卡尔曼滤波预测过程
算法·yolo·目标跟踪·ultralytics·车跟踪·轨迹算法·deep-oc-sort
老师我太想进步了20264 小时前
【数据结构-3】算法美学之降复杂度
数据结构·算法
机器人零零壹10 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
ZhengEnCi12 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法