当前位置: 首页 > news >正文

【LeetCode】—169.多数元素

image-20250326184105719

✏️ 关于专栏:专栏用于记录 LeetCode 中做题与总结

文章目录

      • 多数元素
        • ▐ 题目描述
        • ▐ 题目示例
        • ▐ 题目提示
        • ▐ 思路&代码
          • 方法 1:哈希表
          • 方法2:数组排序
          • 方法3:Boyer-Moore投票算法

多数元素

▐ 题目描述

题目链接:169.多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

▐ 题目示例

示例 1:

输入:nums = [3,2,3]
输出:3

示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2
▐ 题目提示
  • n == nums.length
  • 1 <= n <= 5 * 104
  • -109 <= nums[i] <= 109

**进阶:**尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题

▐ 思路&代码
方法 1:哈希表

遍历数组 n u m s nums nums,用 H a s h M a p HashMap HashMap统计各数字的数量,即可找出众数。

时间复杂度O(N),空间复杂度O(N)。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int ans = 0;
        unordered_map<int,int> mp;
        for(int i = 0;i < nums.size();i++){
            mp[nums[i]]++;
        }
        for(auto it:mp){
            if(it.second > (nums.size()/2)){
            ans = it.first;
            }
        }
        return ans;
    }
};
方法2:数组排序

将数组 n u m s nums nums排序,由多数元素出现的次数大于 ⌊ n / 2 ⌋ ⌊ n/2 ⌋ n/2,所以 n u m s nums nums数组中第 n / 2 n/2 n/2个元素一定是多数元素。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        return nums[nums.size()/2];
    }
};
方法3:Boyer-Moore投票算法
  • 记多数元素的票数为 + 1 +1 +1,其余数的票数为 − 1 -1 1,则一定有所有数字的票数和 > 0 >0 >0

  • 若数组的前 i i i个数字的票数和 = 0 =0 =0,则数组剩余 ( n − a ) (n-a) (na)个数字的票数和一定仍 > 0 >0 >0,即后 ( n − a ) (n-a) (na)个数字的众数仍为 x x x​​。

步骤

  1. 初始化 candidate = 0count = 0
  2. 遍历数组 nums
    • 如果 count == 0(表示当前没有候选元素),candidate 设置为当前元素
    • 如果当前元素等于 candidate,增加 count
    • 否则,减少 count(表示当前元素与 candidate 发生对冲)。
  3. 遍历结束后,candidate 就是多数元素

image-20250327140501200

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int candidate = 0;
        int count = 0;
        for(int num : nums){
            if(count == 0) candidate = num;
            count += num == candidate ? 1 : -1;
        }
        return candidate;
    }
};

d1fded34d21c16a44c687a112865ab0

http://www.dtcms.com/a/99327.html

相关文章:

  • Java基础-21-基本语法-封装
  • 聚合根的特性
  • CI/CD-Jenkins安装与应用
  • 【网络编程】搭建一个简单的UDP通信服务器和客户端
  • c#winform,倒鸭子字幕效果,typemonkey字幕效果,抖音瀑布流字幕效果
  • uniapp中的流式输出
  • 蓝桥杯 14 天 十五届蓝桥杯 数字诗意
  • 雨云云应用测评!内测持续进行中!
  • 深度学习中常见的专业术语汇总
  • SQL Server 可用性组自动种子设定失败问题
  • .NET开发基础知识1-10
  • 无人机宽带自组网机载电台技术详解,50KM超远图数传输系统实现详解
  • Python控制结构详解
  • 群体智能优化算法-流向算法(Flow Direction Algorithm, FDA,含Matlab源代码)
  • FALL靶机渗透实战:从信息收集到特权升级的完整链分析
  • postgresql 重置对应表序列最大值
  • 药用植物次生代谢的多层调控-文献精读123
  • 如何利用<ruby>、<rt>、<rp>标签实现中文注音或字符注释?
  • 车载以太网网络测试 -25【SOME/IP-报文格式-1】
  • AI助力高效办公:如何利用AI制作PPT提升工作效率
  • RAG模型
  • 医疗CMS高效管理:简化更新维护流程
  • Open HarmonyOS 5.0 分布式软总线子系统 (DSoftBus) 详细设计与运行分析报告
  • 自动化测试知识详解
  • RuoYi基础学习
  • 拦截器和过滤器详解
  • 前端D3.js面试题及参考答案
  • Linux安装Cmake (Centos 7.9)
  • Python小练习系列 Vol.3:生成有效括号组合(回溯 + DFS)
  • 【15】Selenium 爬取实战