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

每日一题——数组中出现次数超过一半的数字

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

    • 题目描述
      • 数据范围
    • 输入描述
    • 输出描述
    • 示例
      • 示例1
      • 示例2
      • 示例3
    • 题解
      • 解题思路
      • 摩尔投票算法
        • 步骤:
      • 代码实现
      • 代码解析
      • 时间与空间复杂度

题目描述

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

例如,输入一个长度为9的数组 [1, 2, 3, 2, 2, 2, 5, 4, 2]。由于数字 2 在数组中出现了5次,超过数组长度的一半,因此输出 2

数据范围

  • 数组长度:n ≤ 50000
  • 数组元素值:0 ≤ val ≤ 10000
  • 要求空间复杂度:O(1)
  • 时间复杂度:O(n)

输入描述

  • 输入保证数组非空,且保证有解。

输出描述

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

示例

示例1

输入:

[1,2,3,2,2,2,5,4,2]

返回值:

2

示例2

输入:

[3,3,3,3,2,2,2]

返回值:

3

示例3

输入:

[1]

返回值:

1

题解

解题思路

本题的关键在于找出数组中出现次数超过一半的数字。我们可以使用 摩尔投票算法 来高效解决这个问题。该算法的时间复杂度为 O(n),且空间复杂度为 O(1)

摩尔投票算法

摩尔投票算法的核心思想是通过对数组进行两次扫描,首先确定一个候选元素,然后验证这个候选元素是否满足条件。

步骤:
  1. 第一遍扫描:我们用一个变量 candidate 来记录候选的数字,同时用一个 count 来记录当前候选数字的计数。如果遇到相同的数字,count 增加;如果遇到不同的数字,count 减少。当 count 为 0 时,更新 candidate 为当前数字,并重置 count 为 1。

  2. 第二遍扫描:验证 candidate 是否真的超过了数组长度的一半。如果是,返回该数字,否则返回其他错误值(但本题保证必定有解)。

代码实现

#include <vector>
#include <iostream>
using namespace std;int majorityElement(vector<int>& nums) {int candidate = -1, count = 0;// 第一遍扫描,找出候选元素for (int num : nums) {if (count == 0) {candidate = num;count = 1;} else if (num == candidate) {count++;} else {count--;}}// 第二遍扫描,确认候选元素是否为多数元素count = 0;for (int num : nums) {if (num == candidate) {count++;}}return count > nums.size() / 2 ? candidate : -1; // 返回候选元素
}

代码解析

  • 第一遍扫描:我们首先设定 candidate 为 -1,表示当前还没有候选数字。count 用来计数,初始值为 0。在遍历数组时,遇到与 candidate 相同的数字时增加 count,否则减少 count。当 count 为 0 时,说明当前数字可以成为候选数字,重置 candidate 为当前数字,count 为 1。

  • 第二遍扫描:确认 candidate 是否真的是出现次数超过数组一半的数字。我们遍历数组,统计 candidate 的出现次数,最后检查它是否大于数组长度的一半。

时间与空间复杂度

  • 时间复杂度O(n),需要两次遍历数组,分别为找候选数字和验证候选数字。
  • 空间复杂度O(1),只用了常数空间来存储候选元素和计数。

相关文章:

每日一题——数组中出现次数超过一半的数字

数组中出现次数超过一半的数字 题目描述数据范围 输入描述输出描述示例示例1示例2示例3 题解解题思路摩尔投票算法步骤&#xff1a; 代码实现代码解析时间与空间复杂度 题目描述 给定一个长度为 n 的数组&#xff0c;数组中有一个数字出现的次数超过数组长度的一半&#xff0c…...

【AI】DeepSeek知识类任务和推理能力均表现优秀

2024 年 12 月 26 日&#xff0c;杭州深度求索&#xff08;DeepSeek AI&#xff09;发布 DeepSeek-V3 并同步开源&#xff0c;据介绍&#xff0c;DeepSeek-V3 多项评测成绩超越了 Qwen2.5-72B 和 Llama-3.1-405B 等其他开源模型&#xff0c;并在性能上和世界顶尖的闭源模型 GPT…...

编程领域的IO模型(BIO,NIO,AIO)

目前对于市面上绝大多数的应用来说&#xff0c;不能实现的业务功能太少了。更多的是对底层细节&#xff0c;性能优化的追求。其中IO就是性能优化中很重要的一环。Redis快&#xff0c;mysql缓冲区存在的意义。都跟IO有着密切关系。IO其实我们都在用&#xff0c;输入输出流这块。…...

DeepSeek为何能爆火

摘要&#xff1a;近年来&#xff0c;DeepSeek作为一款新兴的社交媒体应用&#xff0c;迅速在年轻人群体中走红&#xff0c;引发了广泛关注。本文旨在探讨DeepSeek为何能在短时间内爆火&#xff0c;从而为我国社交媒体的发展提供参考。首先&#xff0c;通过文献分析&#xff0c;…...

【AIGC】语言模型的发展历程:从统计方法到大规模预训练模型的演化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;语言模型的发展历程&#xff1a;从统计方法到大规模预训练模型的演化1 统计语言模型&#xff08;Statistical Language Model, SLM&#xff09;&#xff1a;统…...

基于 Nginx 的 CDN 基础实现

概览 本文是对基于Nginx的CDN网络的学习笔记&#xff0c;阅读的代码为&#xff1a;https://github.com/leandromoreira/cdn-up-and-running 其中&#xff0c;先确定CDN中的一些基础概念&#xff1a; Balancer&#xff1a;负载均衡&#xff0c;即请求数据的流量最开始打到Bal…...

【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战

【04】Java若依vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战 项目背景 本项目经费43000元&#xff0c;需求文档如下&#xff0c;工期25天&#xff0c;目前已经过了8天&#xff0c;时间不多了&#x…...

机器学习:朴素贝叶斯分类器

贝叶斯决策论是概率框架下实施决策的基本方法,对分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。 贝叶斯定理是贝叶斯决策论的基础&#xff0c;描述了如何根据新的证据更新先验概率&#xff0c;贝叶斯定理&…...

FlutterWeb实战:02-加载体验优化

背景 默认情况下,Flutter 打包 web 以后,首次打开页面需要加载大量的资源,这就需要做首屏加载优化。 渲染引擎 通过分析,canvaskit 和 skwasm 需要加载较大的引擎包,很难优化,目前选择 3.22 版本,故选择 HTML Render 引擎 Flutter Web 计划在 2025 开始弃用 HTML Ren…...

DeepSeek 大模型每个版本的特点以及运用场景对比

deepseek 网页地址:DeepSeek | 深度求索 1. DeepSeek-V1 发布时间:2024年1月 参数规模:预训练数据量2TB,具体参数未明确公开,推测为数十亿级别 功能特点: 编码能力:支持多种编程语言(如Python、Java、C++),可生成高质量代码框架。 长上下文处理:支持128K上下文窗口,…...

【Langchain学习笔记(一)】Langchain介绍

Langchain介绍 Langchain介绍前言1、Langchain 是什么2、为什么要用 Langchain3、Langchain 的核心4、Langchain 的底层原理5、Langchain 的应用场景 Langchain介绍 前言 想象一下&#xff0c;如果你能让聊天机器人不仅仅回答通用问题&#xff0c;还能从你自己的数据库或文件…...

VSCode中出现“#include错误,请更新includePath“问题,解决方法

1、出现的问题 在编写C程序时&#xff0c;想引用头文件但是出现如下提示&#xff1a; &#xff08;1&#xff09;首先检查要引用的头文件是否存在&#xff0c;位于哪里。 &#xff08;2&#xff09;如果头文件存在&#xff0c;在编译时提醒VSCode终端中"#include错误&am…...

【HeadFirst系列之HeadFirstJava】第2天之类与对象-拜访对象村

前言 从今日起&#xff0c;陆续分享《HeadFirstJava》的读书笔记&#xff0c;希望能够帮助大家更好的理解Java&#xff0c;提高自己的基础编码能力。 Java是一门面向对象的高级编程语言&#xff0c;常年霸占编程语言排行榜前三。 Java是目前国内的主流开发语言&#xff0c;基本…...

机试题——D路通信

题目描述 现在老师给了他们一个D路通信。他们面对的通信链路有如下几个性质&#xff1a; 高斯噪声性&#xff1a;如果发出一段字符串作为消息&#xff0c;消息的开始前和结束后可能会出现随机高斯噪声。内容完整性&#xff1a;该过程不会丢失任何字符&#xff0c;字符顺序也不…...

sqlite 查看表结构

在SQLite中&#xff0c;查看表结构通常有以下几种方法&#xff1a; 使用.schema命令 在SQLite的命令行界面中&#xff0c;你可以使用.schema命令加上表名来查看该表的结构。例如&#xff0c;如果你想查看名为your_table_name的表结构&#xff0c;你可以这样做&#xff1a; .s…...

2025清华:DeepSeek从入门到精通.pdf(附下载)

本文是一份关于如何深入理解和使用DeepSeek技术的全面指南&#xff0c;由清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室的余梦珑博士后及其团队编撰。DeepSeek是一家中国科技公司&#xff0c;专注于通用人工智能&#xff08;AGI&#xff09;的研发&#xff0c;其开源推…...

力扣LeetCode: 80 删除有序数组中的重复项Ⅱ

题目&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件…...

MoMask:可将文本描述作为输入并生成相应的高质量人体运动动作

该图展示了 MoMask &#xff08;一种最先进的人体运动生成模型&#xff09;生成的运动示例。MoMask 使用文本到运动范式进行操作&#xff0c;其中它将文本描述作为输入并生成相应的高质量人体运动。这种方法确保生成的动作准确反映给定的文本条件&#xff0c;展示了 MoMask 生成…...

PAT甲级1043、 Is It a Binary Search Tree

题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the nodes key.The right subtree of a node contains only nodes with keys greater…...

【Python】元组

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;Python 文章目录 1. 元组的本质与基础概念1.1 不可变序列的意义1.2 元组与数学概念的联系 2. 元组的创建方式详解2.1 标准创建形式2.2 单元素元组的特殊处理2.3 使用 tuple() 函数进行转换 3. 元组的基本操作深入剖析3.1 索引操…...

[RabbitMQ] RabbitMQ常见面试题

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

旋转位置编码(RoPE)讲解和代码实现

旋转位置编码(Rotary Position Embedding:RoPE)讲解和代码实现 1. 什么是位置编码? 在 Transformer 模型中,位置编码的作用是为模型提供序列中每个 token 的位置信息。因为 Transformer 本身没有像 RNN 那样的顺序结构,所以需要通过位置编码来告诉模型 token 的顺序。 …...

小红书自动化:如何利用Make批量生成爆款笔记

小红书自动化&#xff1a;如何利用Make制作个人自媒体中心&#xff0c;批量生成爆款笔记 引言 在如今信息爆炸的时代&#xff0c;如何高效地获取和分享优质内容&#xff0c;成为了每位自媒体工作者必须面对的挑战。你是否想过&#xff0c;如果能够将这项繁复的工作实现自动化…...

计算机组成原理 | (四)存储器

&#x1f32e;&#x1f32e;&#x1f32e;宝子们好呀&#xff0c;今天继续更新我的学习笔记&#xff0c;教我计算机组成原理的老师是SDUCS的zrh老师&#xff0c;感谢z老师的教导&#xff0c;接下来我就放上我的手写笔记&#xff0c;供大家学习参考&#xff0c;适合大家预习和复…...

Maven 版本管理与 SNAPSHOT 详解

1. Maven 版本管理概述 在 Maven 项目中&#xff0c;版本号&#xff08;Version&#xff09;是用于区分不同软件版本的重要标识。Maven 提供了一套标准的版本管理机制&#xff0c;包括&#xff1a; 正式版本&#xff08;Release Version&#xff09;快照版本&#xff08;SNAP…...

基于 GEE 利用 SDWI 指数进行逐月水域面积提取

目录 1 SDWI指数 2 完整代码 3 运行结果 微波遥感具有全天候、全天时工作能力&#xff0c;能穿透云层&#xff0c;不受气象条件和光照水平影响&#xff0c;因此近年来利用微波遥感提取水体信息也备受关注。本文分享使用 Sentinel-1遥感影像通过SDWI指数来进行逐月水域面积计…...

XMind 下载与使用教程:附百度网盘地址

一、引言 在信息爆炸的时代&#xff0c;如何高效地整理和管理知识成为了许多人面临的挑战。XMind 作为一款功能强大的思维导图软件&#xff0c;能够帮助我们清晰地梳理思路、整合信息&#xff0c;从而提升学习和工作效率。本文将详细介绍 XMind 的下载方法 二、XMind 的下载与…...

[EAI-034] 通过在线强化学习改进VLA模型

Paper Card 论文标题&#xff1a;Improving Vision-Language-Action Model with Online Reinforcement Learning 论文作者&#xff1a;Yanjiang Guo, Jianke Zhang, Xiaoyu Chen, Xiang Ji, Yen-Jen Wang, Yucheng Hu, Jianyu Chen 论文链接&#xff1a;https://arxiv.org/abs/…...

Python 和 JavaScript 中 Yield 的区别

Python 和 JavaScript 中 Yield 的区别 目录 Python 和 JavaScript 中 Yield 的区别PythonyieldJavaScriptyieldPythonyield fromJavaScriptyield* 推荐超级课程&#xff1a; Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 Pythonyield 在 Python 中…...

每日学习 设计模式 五种不同的单例模式

狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…...