面试题 17.10. 主要元素

题目

数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。

示例 1:

输入:[1,2,5,9,5,9,5,5,5]
输出:5
示例 2:

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

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

解题思路

摩尔投票理解

对于[1,2,5,9,5,9,5,5,5],主要元素为5,可以想象成元素被分成了两拨,一波是主要元素,一波是非主要元素。
假设元素之间两两相互抵消

  • 在最坏的情况下,所有非主要元素和主要元素两两相互抵消,最后应该会剩下一个主要元素
  • 在最好情况下,非主要元素之间互相残杀,先把非主要元素内部的元素尽量抵消掉,然后再去与主要元素抵消,最后剩下的主要元素>1
  • 所以即使在最坏的情况下,仍然最少会剩下一个主要元素的
  • 所以我们假设主要元素是can,cnt代表can元素与非主要元素抵消后,can元素还剩多少个,当cnt==0时,说明当前的can元素已经被全部抵消掉了,需要重新设定新的can元素
  • 因为使用can记录了当前主要元素,所以可以防止相同元素之前互相残杀

代码

class Solution {public int majorityElement(int[] nums) {int can=-1,cnt=0,res=0;for (int num : nums) {if(cnt==0){can=num;}if(num==can){cnt++;}else {cnt--;}}for (int num : nums) {if(num==can)res++;}return res>=(int)(Math.floor((double)nums.length/2)+1)?can:-1;}
}

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

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

相关文章

简单团队-爬取豆瓣电影T250-项目进度

本次主要讲解一下我们的页面设计及展示最终效果: 页面设计主要用到的软件是:html,css,js, 主要用的编译器是:sublime,dreamweaver,eclipse,由于每个人使用习惯不一样&…

鸽子为什么喜欢盘旋_如何为鸽子回避系统设置数据收集

鸽子为什么喜欢盘旋鸽子回避系统 (Pigeon Avoidance System) Disclaimer: You are reading Part 2 that describes the technical setup. Part 1 gave an overview of the Pigeon Avoidance System and Part 3 provides details about the Pigeon Recognition Model.免责声明&a…

scrum认证费用_如何获得专业Scrum大师的认证-快速和慢速方式

scrum认证费用A few months ago, I got the Professional Scrum Master Certification (PSM I). 几个月前,我获得了专业Scrum Master认证(PSM I)。 This is a trending certification nowadays, because most companies operate with some sort of agile methodolo…

981. 基于时间的键值存储

创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作: set(string key, string value, int timestamp) 存储键 key、值 value,以及给定的时间戳 timestamp。 get(string key, int timestamp) 返回先前调用 set(key, value, timesta…

前端开发-DOM

文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口。它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式。我们最为关心的是,DOM把网页和脚本以及其他的编程语言联系了起来。…

css 绘制三角形_解释CSS形状:如何使用纯CSS绘制圆,三角形等

css 绘制三角形Before we start. If you want more free content but in video format. Dont miss out on my Youtube channel where I publish weekly videos on FrontEnd coding. https://www.youtube.com/user/Weibenfalk----------Are you new to web development and CSS?…

密码学基本概念(一)

区块链兄弟社区,区块链技术专业问答先行者,中国区块链技术爱好者聚集地 作者:于中阳 来源:区块链兄弟 原文链接:http://www.blockchainbrother.com/article/72 著权归作者所有。商业转载请联系作者获得授权&#xff0c…

JAVA-初步认识-第十三章-多线程(验证同步函数的锁)

一. 至于同步函数用的是哪个锁,我们可以验证一下,借助原先卖票的例子 对于程序中的num,从100改为400,DOS的结果显示的始终都是0线程,票号最小都是1。 票号是没有问题的,因为同步了。 有人针对只出现0线程&a…

追求卓越追求完美规范学习_追求新的黄金比例

追求卓越追求完美规范学习The golden ratio is originally a mathematical term. But art, architecture, and design are inconceivable without this math. Everyone aspires to golden proportions as beautiful and unattainable perfection. By visualizing data, we chal…

leetcode 275. H 指数 II

给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照 升序排列 。编写一个方法,计算出研究者的 h 指数。 h 指数的定义: “h 代表“高引用次数”(high citations),一名科研…

Node js开发中的那些旮旮角角 第一部

#前戏 上一周是我到现公司来最忙碌的(最有意思的)一周了,为什么这么说呢?因为项目中需要提供服务端对用户病人信息的一个汇总并以email的形式分享信息的接口,在几天的时间里调研处理一套实施方案。我们服务端是Node.js…

文件2. 文件重命名

servlet对本机已存在的文件进行重命名。 .jsp界面 1 <form action"<%basePath %>fileAction" method"get" >2 <table>3 <tr>4 <td>输入文件路径</td>5 <td&…

js字符串slice_JavaScript子字符串示例-JS中的Slice,Substr和Substring方法

js字符串sliceIn daily programming, we often need to work with strings. Fortunately, there are many built-in methods in JavaScript that help us while working with arrays, strings and other data types. We can use these methods for various operations like sea…

leetcode 218. 天际线问题

城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度&#xff0c;请返回由这些建筑物形成的 天际线 。 每个建筑物的几何信息由数组 buildings 表示&#xff0c;其中三元组 buildings[i] [lefti, righti, heighti] 表示&#xff1a…

[Android Pro] 终极组件化框架项目方案详解

cp from : https://blog.csdn.net/pochenpiji159/article/details/78660844 前言 本文所讲的组件化案例是基于自己开源的组件化框架项目github上地址github.com/HelloChenJi…其中即时通讯(Chat)模块是单独的项目github上地址github.com/HelloChenJi… 1.什么是组件化&#xff…

如何写一个vue指令directive

举个例子 &#xff1a;clickoutside.js const clickoutsideContext clickoutsideContext;export default {/*param el 指令所绑定的元素param binding {Object} param vnode vue编译生成的虚拟节点*/bind (el, binding, vnode) {const documentHandler function(e) {console.…

安装angular cli_Angular 9适用于初学者—如何使用Angular CLI安装第一个应用程序

安装angular cliAngular is one of the most popular JavaScript frameworks created and developed by Google. In the last couple of years, ReactJS has gained a lot of interest and has become the most popular modern JS library in the industry. But this doesn’t …

leetcode 1818. 绝对差值和

给你两个正整数数组 nums1 和 nums2 &#xff0c;数组的长度都是 n 。 数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|&#xff08;0 < i < n&#xff09;的 总和&#xff08;下标从 0 开始&#xff09;。 你可以选用 nums1 中的 任意一个 元素来…

【转载】keil5中加入STM32F10X_HD,USE_STDPERIPH_DRIVER的原因

初学STM32&#xff0c;在RealView MDK 环境中使用STM32固件库建立工程时&#xff0c;初学者可能会遇到编译不通过的问题。出现如下警告或错误提示&#xff1a; warning: #223-D: function "assert_param" declared implicitly;assert_param(IS_GPIO_ALL_PERIPH(GPIOx…