leetcode169. 多数元素,摩尔投票法附证明

news2024/11/15 8:47:32

leetcode169. 多数元素

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

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

示例 1:
输入:nums = [3,2,3]
输出:3

示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2

目录

    • leetcode169. 多数元素
    • 题目分析
    • 算法介绍
      • 算法证明
        • 推论一
        • 推论二
    • 算法步骤
      • 候选者选择
    • 流程图
    • 具体代码
    • 算法分析
    • 相似题目

题目分析

这道题目要求我们在一个整数数组中找到众数,即出现次数超过数组长度一半的元素。题目保证这样的元素必定存在。

注意,此题中的众数指的是在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

算法介绍

这里使用的是摩尔投票算法(Boyer-Moore Voting Algorithm)。这个算法的核心思想是通过相互抵消的方式,找到数组中出现次数超过一半的元素。
候选者选择:遍历数组,维护一个候选元素candidate和计数器count。当count为0时,将当前元素设为candidate,并将count置为1。如果遇到相同的元素,则增加count;如果遇到不同的元素,则减少count

算法证明

推论一

假设数组中存在一个众数majority,其出现次数为m,数组长度为n。由于majority是众数,所以m > n/2

  • 对于每个非众数元素,我们将其票数记为-1。
  • 对于每个众数元素,我们将其票数记为+1。

由于majority出现的次数超过一半,所以所有数字的票数和sum必定大于0。

推论二

假设数组的前a个数字的票数和为0,即所有非众数元素已经被抵消。

  • 由于众数majority出现m次,其中m > n/2,所以剩余的n-a个数字中,至少还剩下m-a个众数元素。
  • 因此,剩余数字的票数和仍然大于0,即后n-a个数字的众数仍为majority

算法步骤

候选者选择

  1. 遍历数组:逐个检查数组中的每个元素。
  2. 维护候选元素和计数器:使用candidate存储当前可能的众数,count记录其出现次数。
  3. 抵消不同元素:当遇到与candidate相同的元素时,增加count;当遇到不同的元素时,减少count。当count变为0时,更换candidate

流程图

在这里插入图片描述

具体代码

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

算法分析

  • 时间复杂度:O(n),其中n是数组的长度。算法只需要遍历数组两次。
  • 空间复杂度:O(1),算法只需要常数级别的额外空间。
  • 易错点:在维护candidatecount时,需要注意逻辑的准确性,特别是在count为0时更换candidate
  • 注意点:题目已经保证众数存在,这是使用摩尔投票算法的前提。

相似题目

题目链接
求众数 II在一个整数数组中找到所有出现次数超过 ⌊ n/3 ⌋ 次的元素。
检查一个数是否在数组中占绝大多数判断一个数在一个排序数组中是否出现次数超过一半。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1996707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# winform 三层架构 增删改查 修改数据(修改篇)

ss一.留言 本专栏三层架构已经更新了 添加 登录 显示&#xff0c;还差修改以及删除&#xff0c;本篇更新修改&#xff0c;主要操作为点击修改某一条数据&#xff0c;然后跳转页面进行修改。 二.展示 我们先看DAL代码 /// <summary>/// 修改/// </summary>/// &l…

【RTOS面试题】什么是抢占?抢占的原理、抢占的好处、抢占有什么局限性?

&#x1f48c; 所属专栏&#xff1a;【RTOS-操作系统-面试题】 &#x1f600; 作  者&#xff1a; 于晓超 &#x1f680; 个人简介&#xff1a;嵌入式工程师&#xff0c;专注嵌入式领域基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大家&#xf…

大语言模型的模型量化(INT8/INT4)技术

目录 一、LLM.in8 的量化方案 1.1 模型量化的动机和原理1.2 LLM.int8 量化的精度和性能1.3 LLM.int8 量化的实践 二、SmoothQuant 量化方案 2.1 SmoothQuant 的基本原理2.2 SmoothQuant 的实践 三、GPTQ 量化训练方案 3.1 GPTQ 的基本原理3.2 GPTQ 的实践 参考资料 一、LLM.i…

让对话AI帮助你做程序架构设计,以及解决你的疑问

我想问下对话AI,本文采取的是chatgpt免费版 我问&#xff1a; 你说程序的设计&#xff0c;前后端分离的BS架构。比如工人基础档案1000条记录&#xff0c;工程项目基础档案10条记录&#xff0c;其他相关这两个基础档案的具体功能&#xff0c;比如打卡记录&#xff0c;宿舍记录&…

SD-WAN解决方案功能概述

SD-WAN&#xff08;软件定义广域网&#xff09;是一种前沿的网络技术&#xff0c;旨在为企业提供灵活、智能且高效的广域网连接。SD-WAN的主要功能可以分为四大类&#xff1a;路由、安全性、性能优化和管理控制。 路由功能 路由功能是SD-WAN解决方案的核心部分之一。传统的广域…

B站宋红康JAVA基础视频教程个人笔记chapter05

1.一维数组的定义方式 // 方式一(静态初始化) double[] prices; prices new double[]{20, 32, 43};// 方式二:&#xff08;动态初始化&#xff09; String[] foods; foods new String[4]; // 内部声明数组的长度 // String foods new String[4];// 其他方式 int[] prices …

【字符串哈希】

题目 代码 #include<bits/stdc.h> typedef unsigned long long ULL; const int N 1e510; const int P 131; char str[N]; ULL h[N], p[N]; ULL get_hash(int l, int r) {return h[r] - h[l-1] * p[r-l1]; } int n, m; int main() { scanf("%d%d", &n,…

Scrapy | 手动请求发送实现的数据爬取-段子王网站

文章目录 概要爬取流程代码技术细节format%回调函数 小结 概要 爬取段子王网站的标题和内容 核心 Scrapy的手动请求发送实现的数据爬取yield scrapy.Request(url,callback):GET-caL1back指宽解析函数&#xff0c;用于解析数据yield scrapy.ForRequest(url,callback,formdata):…

科普课堂走起 | 什么是网络安全和数据安全?

网络安全和数据安全是现代数字世界中非常重要的两个概念。让我们来详细了解一下这两个领域。 1.网络安全&#xff08;Network Security&#xff09; 网络安全是指保护网络系统免受未经授权的访问、攻击、破坏或滥用的一系列技术和过程。它旨在确保信息的机密性、完整性和可用…

jmeter-beanshell学习16-自定义函数

之前写了一个从文件获取指定数据&#xff0c;用的时候发现不太好用&#xff0c;写了一大段&#xff0c;只能取出一个数&#xff0c;再想取另一个数&#xff0c;再粘一大段。太不好看了&#xff0c;就想到了函数。查了一下确实可以写。 public int test(a,b){return ab; } ctes…

磁盘无法访问的危机与解救:数之寻软件的数据恢复之旅

在数字时代&#xff0c;磁盘作为数据存储的核心&#xff0c;承载着我们的工作文档、珍贵照片、个人视频等无价之宝。然而&#xff0c;当您试图访问某个磁盘时&#xff0c;却遭遇了“磁盘无法访问”的提示&#xff0c;这无疑是一场突如其来的数据危机。本文将深入探讨磁盘无法访…

浮毛季到了,拒绝猫咪变成“蒲公英”,宠物空气净化器去除浮毛

同为铲屎官&#xff0c;面对家中无处不在的猫毛挑战&#xff0c;想必你也深感头疼。衣物、沙发乃至地毯上的明显猫毛尚可通过吸尘器或粘毛器轻松应对&#xff0c;但那些细微漂浮的毛发却成了难以捉摸的“小恶魔”&#xff0c;普通的空气净化器往往力不从心。对于浮毛&#xff0…

平安城市行业无人机解决方案(网格化巡逻场景应用)

场景痛点&#xff1a; 缺少飞手&#xff0c;导致无人机应用频次偏低 无人机需要人工换电池、维护及存储 日常巡逻 | 无人机补盲巡逻 大疆航点飞行功能&#xff0c;重复性任务只飞一遍&#xff0c;后续重复调用 无人机航点规划&#xff0c;一次设置&#xff0c;后续重复调用…

Linux知识复习第3期

目录 网络管理 &#xff08;1&#xff09;查看IP信息&#xff1a; &#xff08;2&#xff09;配置临时生效的网络连接 &#xff08;3&#xff09;修改配置文件配置网络连接&#xff08;network服务&#xff09; &#xff08;4&#xff09;shell脚本批量IP设置 网络…

HarmonyOS Flex布局

前置知识&#xff1a; 一次开发&#xff0c;多端部署:一套代码工程&#xff0c;一次开发上架&#xff0c;多端按需部署。支撑开发者快速高效的开发支持多种终端设备形态的应用&#xff0c;实现对不同设备兼容的同时&#xff0c;提供跨设备的流转、迁移和协同的分布式体验自适应…

Protobuf:原理、用法与 C++ 实践

在当今的软件开发领域&#xff0c;高效的数据序列化和通信协议是构建高性能、可扩展系统的关键。Protobuf&#xff08;Protocol Buffers&#xff09;作为一种流行的开源序列化框架&#xff0c;正因其出色的性能、简洁的语法和跨语言支持而备受青睐。本文将深入探讨 Protobuf 的…

织梦cms站长导航网站源码

介绍&#xff1a; 源码仅供技术参考严禁商业用途&#xff01;版权归原作者所有&#xff01; 源码上传 到服务器 导航源码安装&#xff1a;域名/install/ 后台信息 后台地址&#xff1a;域名/dede 后台账号&#xff1a;admin 后台密码&#xff1a;7206876 代码下载&#x…

【代码随想录】区间和——前缀和方法

本博文为《代码随想录》学习笔记&#xff0c;原文链接&#xff1a;代码随想录 题目 原题链接&#xff1a;58. 区间和&#xff08;第九期模拟笔试&#xff09; 题目描述 给定一个整数数组 Array&#xff0c;请计算该数组在每个指定区间内元素的总和。 输入描述 第一行输入为…

求职 day13总结

总结一下周一的平安寿险电话面&#xff08;7月29&#xff09;和周二&#xff08;7月30&#xff09;华为od的技术一面、二面、&#xff08;8月1&#xff09;资面和等结果流程。 面试前压力挺大的&#xff0c;毕竟这么久还没有技术面过。周日还想再推一下od技术面时间&#xff0…

【C语言】数据结构前言

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C语言数据结构_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:黄灿灿/数据结构 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 C语言数据结构前言 1. 什么是数据结构&#xff1f; 2. 什么是算…