【LeetCode】剑指 Offer 39. 数组中出现次数超过一半的数字
【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 都可以缩小剩余数组区间。当遍历完成时,最后一轮假设的数字即为众数
算法流程:
- 初始化:票数统计 votes = 0,众数 x
- 循环:遍历数组 nums 中的每个数字 num
- 当票数 votes 等于 0,则假设当前数字 num 是众数
- 当 num = x 时,票数 votes 自增 1;当 num != x 时,票数 votes 自减 1
- 返回值:返回 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. 数组中出现次数超过一半的数字相关推荐
- 剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban ...
- 【四种解法】剑指 Offer 39. 数组中出现次数超过一半的数字
立志用最少的代码做最高效的表达 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, ...
- 【算法】剑指 Offer 39. 数组中出现次数超过一半的数字 【重刷】
1.概述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5
- 《剑指offer》数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果 ...
- 剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)
题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 ...
- 【剑指offer】 数组中出现次数超过一半的数字
- 剑指offer:面试题39. 数组中出现次数超过一半的数字
题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, ...
- leetcode 剑指 Offer 03. 数组中重复的数字 抽屉原理 一个萝卜一个坑
找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...
- Leetcode 剑指 Offer 03. 数组中重复的数字 (每日一题 20210614)
找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复 ...
最新文章
- Linux下目录/文件颜色的含义
- ACM学习历程—UESTC 1226 Huatuo's Medicine(数学)(2015CCPC L)
- java 肌汉模式_设计模式之原型模式详解(附源代码)
- C++学习笔记6:多文件编程
- Java enum枚举
- 月圆花美 中秋快乐!
- cassandra可视化工具_耗时1个月整理!160种Python标准库、第三方库和外部工具都有了...
- Could not connect to SMTP host: smtp.163.com, port: 25;阿里云 ECS
- Linux命令解释之head
- HIve内置函数(functions)使用和解析
- CentOS-6.5-x86_64 最小化安装,已安装包的总数,这些包?
- linux设置进程不忽略信号,Linux下后台进程编写中屏蔽信号
- 数据量太大,内存不够怎么办?
- SX1278性能评估
- Fortran:数组函数详解
- 社区组织计算机网络维护简报,机关到“双报到”社区 开展“我为群众办实事”活动简报...
- 谷粒学院(十七)讲师列表页 | 讲师详情 | 课程列表页 | 课程详情 | 整合阿里云视频点播
- 安卓移动开发技术--微信界面设计
- USBKey数字证书导入操作系统
- 饮水机电路-工作剖析