剑指offer 40. 数组中出现次数超过一半的数字

简介: 剑指offer 40. 数组中出现次数超过一半的数字

题目描述

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

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

思考题

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

数据范围

数组长度 [1,1000]。

样例

输入:[1,2,1,1,3]
输出:1

方法一:摩尔投票法 O(n)

摩尔投票法:


设输入数组 nums 的众数即出现的次数超过一般的数字为 x ,数组长度为 n 。


则一定满足如下两个条件:


假设记众数的票数为 +1 ,非众数的票数为 -1 ,则所有的票数之和一定大于 0 。


若数组的前 a 个数字的票数和等于 0 ,则数组剩余的 (n−a) 个数字的票数和一定大于 0 ,即后 (n-a) 个数字的众数仍为 x 。


所以这道题方法比较奇妙,我们要用一个数 cnt 来记录当前票数,用 val 来记录当前值,步骤如下:


从前往后遍历所有数,cnt 初始为 0 ,val 初始为 -1 。

如果 cnt 为 0 ,则将 val = x ,并且 cnt = 1 。

如果 cnt 不为 0 ,则判断 val 是否等于 x ,如果等于则 cnt 加 1 ,否则减 1 。

最后得到的 val 一定是最终答案。

我们拿题目的例子来举例,看看具体是如何实现的:

4e7e26c031224cac816a6be9a1eadb97.png


第一步:x = 1 ,且 cnt = 0 ,故令 val = x = 1cnt = 1

第二步:x = 2 ,且 cnt != 0 && x != val ,故令 cnt--


894fc7e1c2364d6b92b5532619e2a275.png


第三步:x = 1 ,且 cnt = 0 ,故令 val = x = 1cnt = 1

第四步:x = 1 ,且 cnt != 0 && x == val ,故令 cnt++



第五步:x = 3 ,且 cnt != 0 && x != val ,故令 cnt--


第六步: 返回 val = 1 即该数组出现次数超过一半的数字。

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;
    }
};

欢迎大家在评论区交流~

目录
相关文章
真下饭!字节技术官DDD(领域驱动设计)手册,拆解业务代码首选
至少20年前,一些顶尖的软件设计人员就已经认识到领域建模和设计的重要性,但令人惊讶的是,这么长时间以来几乎没有人写出点儿什么,告诉大家应该做哪些工作或如何去做。尽管这些工作还没有被清楚地表述出来,但一种新的思潮已经形成,它像一股暗流一样在对象社区中涌动,我把这种思潮称为领域驱动设计(domain-driven design)。
|
IDE Linux 开发工具
零基础也能学会!Linux下安装RStudio工具及实现远程访问的详细指南
RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE,并通过 Web 浏览器进行访问,从而将 RStudio IDE 的强大功能和工作效率带到基于服务器的集中式环境中。
|
Java 调度 C++
ANR分析总结
ANR分析总结
1564 0
ANR分析总结
|
SQL 存储 缓存
Mysql优化高级篇(全)
目录前言1. 简介1.1 安装1.2 MySQL逻辑架构存储引擎2. 索引优化分析2.1 原因2.2 常见通用的join查询2.3 索引2.3.1 索引分类2.3.2 索引结构2.3.3 索引情况2.4 性能分析2.4.1 id 前言 本篇文章主要涉及mysql的高级篇,主要是mysql的架构介绍、索引优化分析、查询截取分析、mysql锁机制以及主从复制等 在这之前的学习可参考我之前的文章进行学习 数据库知识 链接 数据库查询常用语句语法 博客链接 数据库中增删改常用语法语句(全) 博客
78839 19
Mysql优化高级篇(全)
|
监控 前端开发 Java
Spring Boot中的拦截器配置
Spring Boot中的拦截器配置
|
机器学习/深度学习 传感器 数据采集
植保机器人在生长监测与分析方面的精准农业应用
植保机器人在生长监测与分析方面的精准农业应用
229 2
|
数据库
R语言中回归模型预测的不同类型置信区间应用比较分析
R语言中回归模型预测的不同类型置信区间应用比较分析
|
机器学习/深度学习 数据可视化 算法
SHAP值:用博弈论的概念解释一个模型
SHAP值:用博弈论的概念解释一个模型
1088 0
SHAP值:用博弈论的概念解释一个模型
|
域名解析 网络协议 算法
阿里云免费SSL证书配置(图文详解)
阿里云SSL免费证书在哪申请?一个阿里云账号一年可以申请20张免费SSL证书,很多同学找不到免费SSL的入口,阿小云来详细说下阿里云SSL证书免费申请入口链接以及免费SSL证书申请流程
4512 0
|
Java
Exception 和 Error 有什么区别?
Java 平台对不同的异常进行了分类,具体被分为了 Exception 和 Error,他们都是继承了 Throwable 类。
259 0
Exception 和 Error 有什么区别?