会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员后可解锁完整内容。
解题思路
多数元素出现次数严格大于 ⌊n/2⌋,题目还保证它一定存在,所以不必处理「没有多数」的情况。
- 最直接的做法是用哈希表统计每个数出现几次,找出次数大于 ⌊n/2⌋ 的那个。n≤5×104,这样做时间和空间都是 O(n),可以通过。
- 更省空间的做法是 Boyer-Moore 投票:维护当前候选人 cand 和它的票数 cnt。遇到 cand 就 cnt+1,遇到别的就 cnt−1;票数掉到 0 时,把当前数立成新的候选人。
- 不同的数会互相抵消。因为多数元素的出现次数过半,抵消完之后留下的候选人一定是它。题目保证存在,所以扫一遍即可,不用再验票。
- 也可以排序后取下标 ⌊n/2⌋ 上的元素,复杂度 O(nlogn)。
- 常见假解:直接输出第一个数(它不一定是多数);只统计正数,漏掉负数多数元素。
题目内容
给定一个大小为 n 的整数数组 nums,请返回数组中的多数元素。
多数元素是指在数组中出现次数大于 ⌊n/2⌋ 的元素。
可以保证数组非空,并且给定的数组中一定存在多数元素。
输入描述
第一行输入一个整数 n,表示数组 nums 的长度。
第二行输入 n 个整数 numsi,表示数组中的各个元素,相邻整数之间用空格分隔。
约束
1≤n≤5×104
−109≤numsi≤109
输入保证数组中一定存在多数元素。
输出描述
输出一个整数,表示数组 nums 中的多数元素。
样例 1
输入
3
3 2 3
输出
3
说明
数字 3 在数组中出现了 2 次。
因为 2>⌊3/2⌋,所以 3 是数组中的多数元素。
样例 2
输入
7
2 2 1 1 1 2 2
输出
2
说明
数字 2 在数组中出现了 4 次。
因为 4>⌊7/2⌋,所以 2 是数组中的多数元素。