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

剑指offer37_数组中出现次数超过一半的数字

数组中出现次数超过一半的数字


数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

假设数组非空,并且一定存在满足条件的数字。

思考题

  • 假设要求只能使用 O(n) 的时间和额外 O(1) 的空间,该怎么做呢?
数据范围

数组长度 [ 1 , 1000 ] [1,1000] [1,1000]

样例
输入:[1,2,1,1,3]输出:1
**算法思路 **

** 摩尔投票算法(Moore Voting Algorithm)  **

  1. 初始化:维护一个候选值 val 和计数器 cnt,初始时 val 为任意值(如 -1),cnt 为 0。
  2. 遍历数组
    • 如果 cnt 为 0,则将当前数字 x 设为候选值 val,并设置 cnt = 1
    • 如果当前数字 x 等于候选值 val,则 cnt 加 1。
    • 如果当前数字 x 不等于候选值 val,则 cnt 减 1。
  3. 返回结果:遍历结束后,val 即为出现次数超过一半的数字。
**关键点: **
  • 摩尔投票算法的核心思想是 “抵消”。出现次数超过一半的数字,最终一定会保留在 val 中,因为其他数字的出现次数总和不足以完全抵消它。
  • 该算法假设输入数组 一定存在 出现次数超过一半的数字。如果题目不保证这一点,需要额外验证步骤(但本题已保证)。
指标说明
时间复杂度O(n)只需遍历数组一次,n 为数组长度。
时间复杂度O(1)只使用了常数级别的额外空间(valcnt)。

class Solution {
public:int moreThanHalfNum_Solution(vector<int>& nums) {int val = -1, cnt = 0;for(auto x : nums){if(!cnt) val = x, cnt = 1;else {if(val == x) cnt ++;else cnt --;}}return val;}
};

相关文章:

  • Rust调用 DeepSeek API
  • Sublime text启用vim
  • Maven-添加子模块
  • Python从入门到实战学习笔记(二)
  • IEC61850 通信协议测试验证方法详解
  • YAML 数据格式详解
  • Python爬虫实战:研究Splinter相关技术
  • 决策树:化繁为简的智能决策利器
  • VR飞夺泸定桥沉浸式历史再现​
  • 开源项目分析:EDoRA | 了解如何基于peft实现EDoRA方法
  • verilog HDLBits刷题“Module fadd”--模块 fadd---加法器2
  • stm32串口(uart)2转发到串口(uart)3实现
  • 深入解析 C++ 中的 map 和 set 封装
  • 60-Oracle 10046事件-实操
  • 引用vue
  • npm包冲突install失败
  • 【智能体】n8n聊天获取链接后爬虫知乎
  • 高并发下分布式数据库性能下降的解决方法
  • 将VSCode的配置迁移到Cursor
  • wsl2 联网设置静态 IP (不能联网问题)
  • 网站优化建设宁夏/seo关键词优化公司哪家好
  • ps如何做网站首页/企业宣传片
  • 网站运营意义/长尾关键词
  • 北京网站建设公司网络营销外包网络建站报价/2021全国大学生营销大赛
  • 中国建设人才网络学院登录入口/沈阳seo整站优化
  • 专业建设网站的企业/优化软件有哪些