【算法题解】LeetCode169.多数元素——摩尔投票算法

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) 的算法解决此问题。

题解

这个问题是典型的求众数问题,可以通过多种方法解决。针对进阶要求,我们可以使用 Boyer-Moore 投票算法,该算法的时间复杂度为 O(n),空间复杂度为 O(1)。

Boyer-Moore 投票算法

Boyer-Moore 投票算法的基本思想是每次从序列中选择两个不同的元素将它们从序列中删除,直到删除完所有的元素或者剩下的元素都相同。这个算法基于一个事实:如果一个数是序列的众数,那么在执行完这样的操作后,最后剩下的数仍然是那个众数。

具体实现步骤如下:

  1. 初始化两个变量:candidate(候选人)和 count。开始时,任选数组中的一个元素作为 candidatecount 设置为 1。
  2. 遍历数组中的每个元素:
    • 如果当前元素与 candidate 相同,则将 count 加一。
    • 如果不同,则将 count 减一。如果 count 变为 0,那么更换 candidate 并将 count 重置为 1。
  3. 遍历结束后,candidate 即为整个数组的众数。

C++ 实现

#include <vector>
using namespace std;int majorityElement(vector<int>& nums) {int count = 0;int candidate = 0;for (int num : nums) {if (count == 0) {candidate = num;}count += (num == candidate) ? 1 : -1;}return candidate;
}

这段代码遍历数组一次,时间复杂度为 O(n),只使用了有限的额外空间(几个变量),空间复杂度为 O(1),满足进阶要求。

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

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

相关文章

每天一点python——day81

#每天一点Python——81 #递归函数&#xff1a; 递归函数&#xff1a; 一个函数在该函数体内调用了该函数本身&#xff0c;这个函数称为递归函数 【释&#xff1a;我自己调用自己的函数】 递归函数的组成部分&#xff1a; 递归调用与递归终止条件。 【一定有一个跳出循环的终止条…

解决WPS拖动整行的操作

如上图&#xff0c;想要把第4行的整行内容&#xff0c;平移到第1行。 1.选中第4行的整行 2.鼠标出现如图的样子时&#xff0c;按住鼠标左键&#xff0c;上移到第1行位置后&#xff0c;放开左键即可。

程序员养生与延寿:关注健康,享受编码之旅

随着信息技术的迅猛发展&#xff0c;程序员的工作变得越来越重要。然而&#xff0c;长时间坐在电脑前&#xff0c;程序员们不可避免地面临着一些健康问题。他们的头发越来越少&#xff0c;眼镜度数越来越高&#xff0c;肚子上的赘肉也越来越多。为了更好地保持健康&#xff0c;…

计算机网络:应用层(上篇)

文章目录 前言一、应用层协议原理1.网络应用的体系结构2.进程通信 二、Web与HTTP1.HTTP概况2.HTTP连接3.HTTP请求报文4.用户-服务器状态&#xff1a;cookies5.Web缓存&#xff08;代理服务器&#xff09; 三、FTP&#xff1a;文件传输协议1.FTP&#xff1a;控制连接与数据连接分…

watch监听中重复触发如何解决?

在实际开发工程中通过获取后端数据监听判断数组中长度是否大于0从而调用其他的方法&#xff0c;但是如果data域中的数据出现变化的话&#xff0c;就会导致监听中的方法重复调用&#xff0c;导致一些不必要的bug&#xff0c;例如&#xff1a; 原理&#xff1a; watch监听的数据…

element-plus 上传组件 el-upload 直传第一次取不到数据

取不到数据是官方("element-plus": "^2.3.4") beforeData在beforeUploadPromise 之前导致异步设置:data 不生效文件传不上去的原因&#xff0c;改为http-request去处理就可以了。挺奇怪&#xff0c;之前用("element-plus": "^2.2.17")…

数组元素的删除

完成数组元素的移动功能&#xff1a;假设数组有n个元素&#xff0c;输入一个数x&#xff0c;把数组的第x个位置的元素删除了&#xff0c;后面的元素依次前进一个位置。 重复若干次这样的删除&#xff0c;得到最后的结果。 输入格式: 第一行包括一个整数n&#xff08;1<n&l…

Diffusion:通过扩散和逆扩散过程生成图像的生成式模型

在当今人工智能大火的时代&#xff0c;AIGC 可以帮助用户完成各种任务。作为 AIGC 主流模型的 DDPM&#xff0c;也时常在各种论文中被提起。DDPM 本质就是一种扩散模型&#xff0c;可以用来生成图片或者为图片去噪。 扩散模型定义了一个扩散的马尔科夫过程&#xff0c;每一步逐…

blender导出相机参数

前言&#xff1a;在 Blender 的图形化界面中&#xff0c;没有直接的选项可以导出渲染图片的外参矩阵。你可以通过 Python API 来获取并导出相机的外参矩阵。 blender导出相机参数 1.单张照片2.多张照片&#xff08;视频&#xff09;3.坐标系转换 1.单张照片 import numpy as …

视频监控平台EasyCVR多场景应用,AI视频分析技术助力行业升级转型

传统的视频监控系统建设&#xff0c;经常存在各方面的因素制约&#xff0c;造成管理机制不健全、统筹规划不到位、联网共享不规范&#xff0c;形成“信息孤岛”、“数据烟囱”。在监控系统的建设中缺乏统一规划&#xff0c;标准不统一、视频图像信息利用率低等问题日益突出。随…

手动将jar包导入本地Maven仓库

1、进入存放jar包的目录&#xff0c;可以先放进仓库底下 2、cmd回车 3、执行命令&#xff0c;看到BUILD SUCCESS就是成功了 -DgroupId、-DartifactId、-Dversion、-Dfile记得换成自己对应的 mvn install:install-file -DgroupIdcom.github.03 -DartifactIdonvif -Dversion1.0.7…

微信小程序自定义tabber凸起

一、实现效果 二、下载地址 下载地址 源码有错自己修改一下就行

射频连接器的6个主要指标

射频连接器的6个主要指标 射频连接器是一类用于电子设备和通信系统中的连接器&#xff0c;用于连接射频信号的传输。射频连接器的性能直接影响着设备的信号传输质量和系统的整体性能。在选择和设计射频连接器时&#xff0c;需要考虑几个关键指标。下面将详细介绍射频连接器的6个…

面试:DDD 领域驱动设计

文章目录 请解释下什么是 DDD 领域驱动设计DDD 的四层领域模型是怎样的&#xff1f;包含哪些基础概念&#xff1f;DDD 中的贫血模型和充血模型有什么区别在 DDD 中&#xff0c;如何处理模型的聚合和聚合根DDD 中的实体和值对象有什么区别&#xff1f;在 DDD 中&#xff0c;如何…

python每日一题——12最小覆盖子串

题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果…

594. 最长和谐子序列 --力扣 --JAVA

题目 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在&#xff0c;给你一个整数数组 nums &#xff0c;请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的子序列是一个由数组派生出来的序列&#xff0c;它可以通过删除一些元素或不删除元素…

网站优化SEO文章采集组合方法

为了在激烈的网络竞争中脱颖而出&#xff0c;SEO专业人士不断寻求创新的方法和技术。其中&#xff0c;SEO文章采集后重组是一项备受关注的技术&#xff0c;通过巧妙地整合和重新组织已有的信息&#xff0c;以提升网站在搜索引擎中的排名和曝光度。 SEO文章采集是这一技术的第一…

简化版Transformer

Transformer 架构可以说是近期深度学习领域许多成功案例背后的主力军。构建深度 Transformer 架构的一种简单方法是将多个相同的 Transformer 「块」&#xff08;block&#xff09;依次堆叠起来&#xff0c;但每个「块」都比较复杂&#xff0c;由许多不同的组件组成&#xff0c…

Vue+Element-ui实例_在form中动态校验tag标签

1.开发需求 在日常开发中&#xff0c;我们会遇到form表单的动态添加和校验&#xff0c;当我们需要在动态添加的内容中再次动态使用输入框的时候&#xff0c;就会变得很繁琐&#xff0c;我在网上找了很多案例&#xff0c;没有符合自己需求的内容&#xff0c;只好闲暇时间自己搞…

Vue3依赖注入

适用场景 尤其针对一个变量需要从顶层组件开始透传&#xff0c;途径很多个子组件最后在第n代子组件使用的时候。对于这些途经的子组件而言&#xff0c;它们不但不使用而且完全不关心该变量具体是什么&#xff0c;只是作为一个传递工具罢了。这种情况下&#xff0c;使用依赖注入…