题目

数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -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;}
}

面试题 17.10. 主要元素相关推荐

  1. leetcode——面试题 17.10. 主要元素

    问题描述: 数组中占比超过一半的元素称之为主要元素.给定一个整数数组,找到它的主要元素.若没有,返回-1. 示例 1: 输入:[1,2,5,9,5,9,5,5,5] 输出:5 示例 2: 输入:[3, ...

  2. 文巾解题 面试题 17.10. 主要元素

    1 题目描述 2 解题思路 因为是O(N)的时间复杂度和O(1)的空间复杂度,所以想到的是Boyer-Moore 投票算法.这个算法的原理可见:算法整理:Boyer-Moore 投票算法_刘文巾的博客 ...

  3. Leetcode每日一题:面试题17.10.find-majority-element-lcci(主要元素)

    思路:这道题不是单纯的摩尔投票法,因为它有可能不存在主要元素,而摩尔投票要求必须存在主要元素: 这里通过摩尔投票法得到的可能是那个渔翁得利的元素,比如2 2 3 3 1,那么最后res=1,但实际上这 ...

  4. Java面试题17 牛客 下面哪个选项正确创建socket连接?

    Java面试题17 牛客 下面哪个选项正确创建socket连接? Socket s = new Socket(8080); Socket s = new Socket("192.168.1. ...

  5. 面试题 17.16. 按摩师

    面试题 17.16. 按摩师 思路:递归只有选和不选两种选择.用数组存储已计算过的值. class Solution { public:int massage(vector<int>&am ...

  6. 面试题17: 打印从1到最大的n位数

    /******************************************************************* *<剑指Offer--名企面试官精讲典型编程题>C ...

  7. 字典树/Trie/前缀树-LeetCode总结:720词典中最长的单词;127. 单词接龙;677. 键值映射;面试题 17.17. 多次搜索;648. 单词替换

    MyTrie结构体和相关操作函数 typedef struct MyTrie {bool is_word;vector<MyTrie*> next;MyTrie():is_word(fal ...

  8. c语言考试编程题万能公式,C语言程序设计历年统考试题集10套含答案(可编辑)

    <C语言程序设计历年统考试题集10套含答案(可编辑)>由会员分享,可在线阅读,更多相关<C语言程序设计历年统考试题集10套含答案(可编辑)(39页珍藏版)>请在人人文库网上搜索 ...

  9. 如何导出Fortify 17.10扫描报告

    使用Fortify对项目源代码进行扫描后,可以把扫描的结果通过报告的形式导出,报告可以保存为pdf格式. 本文介绍一下导出Fortify扫描报告的具体操作步骤. [环境准备] 系统版本:win10版本 ...

最新文章

  1. (转)Mat, vectorpoint2f,Iplimage等等常见类型转换
  2. HTML5 Canvas爱心时钟代码
  3. [redis] 分布式 Redis 的 CRUD 实现
  4. lamba List 转 Map
  5. Azure IoT Hub和Event Hub相关的技术系列-索引篇
  6. alter table add column多个字段_ElementUI表格el-table表头固定自适应高度解决方案
  7. add git 的文件 移除_【Git第八节】移除文件
  8. oracle 对比 clob,解决比较Oracle中CLOB字段问题
  9. 怎么安装64位JAVA,大师来详解
  10. ArcGIS软件应用(一)——专题图制作
  11. 贪吃蛇c语言代码vc,纯C语言实现贪吃蛇游戏(VC6.0)
  12. [分享解决]你的支付授权失败。请核对你的信息并重试,或尝试其他支付方式。请联系你的银行了解更多信息
  13. 在线标注协作服务Hypothes.is的简明教程
  14. SVG格式图片的放大
  15. IC基础知识(十一)时钟周期、状态周期、机器周期、指令周期和总线周期的定义及关系
  16. MATLAB R2018a for Mac
  17. 【杰理AC692X】双LINEIN模式做法
  18. Vue:页面加载进度条
  19. Java 基础学习-Java语言概述
  20. 黑群晖 升级 失联 拯救方案(不丢数据)

热门文章

  1. Vivado工程文件分类
  2. 【C++ Priemr | 15】派生类向基类转换的可访问性
  3. 【金三银四】启动mysql服务器
  4. 计算星期c语言编码,[转载]计算任何一天是星期几的C语言源代码.
  5. Linux学习笔记24——进程管道
  6. Dinosaur Run - Dinosaur world Games
  7. 李开复:年轻人该比谁更拼命吗?
  8. SqlServer双机热备技术实践笔记
  9. [SoapUI] 通过SoapUI发送POST请求,请求的body是JSON格式的数据
  10. HDU4911 Inversion 解题报告