【LeetCode】剑指 Offer 39. 数组中出现次数超过一半的数字

文章目录

  • 【LeetCode】剑指 Offer 39. 数组中出现次数超过一半的数字
  • 一、摩尔投票法

一、摩尔投票法

核心理念为票数正负抵消。此方法时间和空间复杂度分别为 O(n) 和 O(1)

设输入数组 nums 的众数为 x,数组长度为 x

推轮一:若记众数的票数为 +1,非众数的票数为 -1,则一定有所有的票数和 > 0
推论二:若数组的前 a 个数字的票数和 = 0,则数组剩余(n - a)个数字的票数和一定仍 > 0,即后(n - a)个数字的众数仍为 x

根据以上推论,记数组首个元素为 n1,众数为 x,遍历并统计票数。当发生票数和 = 0 时,剩余数组的众数一定不变,这是由于:

  • 当 n1 = x:抵消的所有数字中,有一半是众数 x
  • 当 n1 ≠ x:抵消的所有数字中,众数 x 的数量最少为 0 个,最多为一半

利用此特性,每轮假设发生票数和 = 0 都可以缩小剩余数组区间。当遍历完成时,最后一轮假设的数字即为众数

算法流程:

  1. 初始化:票数统计 votes = 0,众数 x
  2. 循环:遍历数组 nums 中的每个数字 num
    1. 当票数 votes 等于 0,则假设当前数字 num 是众数
    2. 当 num = x 时,票数 votes 自增 1;当 num != x 时,票数 votes 自减 1
  3. 返回值:返回 x 即可
class Solution{public int majorityElement(int[] nums){int x = 0;int votes = 0;for(int num : nums){if(votes == 0) x = num;votes += num == x ? 1 : -1;}return x;}
}
  • 时间复杂度 O(n):n 为数组 nums 长度
  • 空间复杂度 O(1):votes 变量使用常数大小的额外空间

此题还有两种解法较为简单,但是时间复杂度和空间复杂度不是最优的

  • 哈希表统计法
    遍历数组 nums,用 HashMap 统计各数字的数量,即可找出众数。此方法时间和空间复杂度均为 O(n)
  • 数组排序法
    将数组 nums 排序,数组中点的元素一定为众数

【LeetCode】剑指 Offer 39. 数组中出现次数超过一半的数字相关推荐

  1. 剑指 Offer 39. 数组中出现次数超过一半的数字

    剑指 Offer 39. 数组中出现次数超过一半的数字https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban ...

  2. 【四种解法】剑指 Offer 39. 数组中出现次数超过一半的数字

    立志用最少的代码做最高效的表达 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, ...

  3. 【算法】剑指 Offer 39. 数组中出现次数超过一半的数字 【重刷】

    1.概述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5

  4. 《剑指offer》数组中出现次数超过一半的数字

    题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果 ...

  5. 剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)

    题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 ...

  6. 【剑指offer】 数组中出现次数超过一半的数字

  7. 剑指offer:面试题39. 数组中出现次数超过一半的数字

    题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, ...

  8. leetcode 剑指 Offer 03. 数组中重复的数字 抽屉原理 一个萝卜一个坑

    找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...

  9. Leetcode 剑指 Offer 03. 数组中重复的数字 (每日一题 20210614)

    找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复 ...

最新文章

  1. Linux下目录/文件颜色的含义
  2. ACM学习历程—UESTC 1226 Huatuo's Medicine(数学)(2015CCPC L)
  3. java 肌汉模式_设计模式之原型模式详解(附源代码)
  4. C++学习笔记6:多文件编程
  5. Java enum枚举
  6. 月圆花美 中秋快乐!
  7. cassandra可视化工具_耗时1个月整理!160种Python标准库、第三方库和外部工具都有了...
  8. Could not connect to SMTP host: smtp.163.com, port: 25;阿里云 ECS
  9. Linux命令解释之head
  10. HIve内置函数(functions)使用和解析
  11. CentOS-6.5-x86_64 最小化安装,已安装包的总数,这些包?
  12. linux设置进程不忽略信号,Linux下后台进程编写中屏蔽信号
  13. 数据量太大,内存不够怎么办?
  14. SX1278性能评估
  15. Fortran:数组函数详解
  16. 社区组织计算机网络维护简报,机关到“双报到”社区 开展“我为群众办实事”活动简报...
  17. 谷粒学院(十七)讲师列表页 | 讲师详情 | 课程列表页 | 课程详情 | 整合阿里云视频点播
  18. 安卓移动开发技术--微信界面设计
  19. USBKey数字证书导入操作系统
  20. 饮水机电路-工作剖析

热门文章

  1. 多线程怎么保证数据安全_Python threading实现多线程 提高篇 线程同步,以及各种锁...
  2. 浅谈密码学中数论基础
  3. vue-cli3.0 初体验
  4. 【 Linux 网络虚拟化 】Netns
  5. Could not link against boost_system 解决办法
  6. KVM之一:安装准备(基于CentOS6.7)
  7. [洛谷2397]yyy loves Maths VI
  8. NServiceBus主机
  9. Hive 之 导入导出数据
  10. Apache 目录结构与配置指令