算法题打卡力扣第169题:多数元素(easy)

文章目录

    • 题目描述
    • 解法一:暴力解
    • [解法二 排序法](#解法二 排序法)
    • [解法三:Boyer-Moore 投票算法 (最优解)](#解法三:Boyer-Moore 投票算法 (最优解))

题目描述

解法一:暴力解

定义一个数组C用于存放nums数组中每个数出现的次数,然后再遍历C,判断C【i】是否大于⌊ n/2 ⌋,如果是,则返回该元素(计数排序)

代码实现:

cpp 复制代码
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int n = nums.size();
        //需要使用哈希表
        unordered_map<int,int> counts;
        for(int i=0;i<n;i++){
            counts[nums[i]]++;
        }
        //遍历哈希表
        for(auto const&pair:counts){
            if(pair.second>n/2){
                 return pair.first;
            }
        }
        return -1;
    }
};

执行结果:

复杂度分析:

时间 O(n)

空间 O(n)

解法二 排序法

先排序nums,如果存在一个数出现的次数超过了数组长度的一半,那么将数组排序后,这个数必然会出现在数组中间的位置。

代码实现

cpp 复制代码
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(),nums.end());
        return nums[n/2];
    }
};

执行结果

复杂度分析

时间:排序的时间复杂度为O(nlogn)

空间:O(1)

解法三:Boyer-Moore 投票算法 (最优解)

思路: 这是一个非常巧妙的算法。可以想象成不同阵营的人进行"消耗战"。

  1. 我们维护一个 candidate (候选人) 和一个 count (计数器)。
  2. 遍历数组,如果 count 为 0,就将当前元素设为 candidate。
  3. 如果当前元素和 candidate 相同,count 加 1。
  4. 如果当前元素和 candidate 不同,count 减 1 (相当于一组"同归于尽")。
  5. 由于众数的数量超过了其他所有数字数量的总和,它最后一定会留下来成为 candidate。

实现代码

cpp 复制代码
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int n = nums.size();
        int candidate=0,count=0;
        for(int i=0;i<n;i++){
            if(count==0){
                candidate=nums[i];
            }
            if(candidate==nums[i]){
                count++;
            }else{
                count--;
            }
        }
        return candidate;
    }
};

执行结果

复杂度分析

时间O(n)

空间O(1)

相关推荐
前端小刘哥11 分钟前
新版视频直播点播EasyDSS平台,让跨团队沟通高效又顺畅
算法
明月(Alioo)42 分钟前
机器学习入门,无监督学习之K-Means聚类算法完全指南:面向Java开发者的Python实现详解
python·算法·机器学习
叶梅树43 分钟前
从零构建A股量化交易工具:基于Qlib的全栈系统指南
前端·后端·算法
lingran__1 小时前
算法沉淀第三天(统计二进制中1的个数 两个整数二进制位不同个数)
c++·算法
MicroTech20251 小时前
微算法科技MLGO推出隐私感知联合DNN模型部署和分区优化技术,开启协作边缘推理新时代
科技·算法·dnn
小冯记录编程2 小时前
深入解析C++ for循环原理
开发语言·c++·算法
chenchihwen3 小时前
深度解析RAG系统中的PDF解析模块:Docling集成与并行处理实践
python·算法·pdf
做科研的周师兄5 小时前
【机器学习入门】7.4 随机森林:一文吃透随机森林——从原理到核心特点
人工智能·学习·算法·随机森林·机器学习·支持向量机·数据挖掘
Sunsets_Red5 小时前
差分操作正确性证明
java·c语言·c++·python·算法·c#
【杨(_> <_)】6 小时前
SAR信号处理重要工具-傅里叶变换(二)
算法·信号处理·傅里叶分析·菲涅尔函数