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

摩尔投票算法

思路

算法首先将数组的第一个元素作为候选众数,并设置初始计数为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是数组的长度,因为它只需要遍历数组一次。这使得它成为在大型数据集中找到多数元素的高效方法。

相关推荐
hweiyu002 分钟前
排序算法:冒泡排序
算法·排序算法
brave and determined14 分钟前
CANN训练营 学习(day9)昇腾AscendC算子开发实战:从零到性能冠军
人工智能·算法·机器学习·ai·开发环境·算子开发·昇腾ai
Dave.B43 分钟前
用【vtk3DLinearGridCrinkleExtractor】快速提取3D网格相交面
算法·3d·vtk
yaoh.wang1 小时前
力扣(LeetCode) 1: 两数之和 - 解法思路
python·程序人生·算法·leetcode·面试·跳槽·哈希算法
Code Slacker1 小时前
LeetCode Hot100 —— 滑动窗口(面试纯背版)(四)
数据结构·c++·算法·leetcode
brave and determined1 小时前
CANN训练营 学习(day8)昇腾大模型推理调优实战指南
人工智能·算法·机器学习·ai实战·昇腾ai·ai推理·实战记录
winfield8212 小时前
关于工程实践的面试问题
微服务·面试
总爱写点小BUG2 小时前
打印不同的三角形(C语言)
java·c语言·算法
yaoh.wang2 小时前
力扣(LeetCode) 27: 移除元素 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·双指针
2401_841495642 小时前
【自然语言处理】中文 n-gram 词模型
人工智能·python·算法·自然语言处理·n-gram·中文文本生成模型·kneser-ney平滑