主要元素
题目描述:
数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。
示例 :
输入:[1,2,5,9,5,9,5,5,5]
输出:5
解法
- 常数级的空间复杂度限制了不能使用哈希表统计各元素出现的次数,只能简单进行迭代,用几个变量来记录结果。这里直接介绍摩尔投票的算法。
- 对于个数大于总数一半的元素而言,如果与不同于自身的元素进行抵消,最终仍会有剩余。基于此,先遍历数组,初始时设置一个候选众数,遇到不同的元素就进行抵消;如果完全抵消就换新的候选众数;最终的候选人便有可能是众数,但其他元素因为没有“存活”到最后,必然不是众数。
- 这里解释一下为什么最终候选人不一定是众数,例如数组[1, 2, 2, 1, 3],前面元素 1 和 2 相互抵消,最终剩下元素 3 坐收渔翁之利,但显然它不是众数。所以最后还需要统计候选人在数组中的总次数,如果确实大于一半,那就说明是众数;否则不是。
代码
class Solution:
def majorityElement(self, nums: List[int]) -> int:
cur_num, cnt, total_cnt = 0, 0, 0
for num in nums:
if cnt == 0:
cur_num = num
cnt = 1
else:
cnt += 1 if cur_num == num else -1
for num in nums:
if num == cur_num:
total_cnt += 1
return -1 if cnt == 0 or total_cnt <= len(nums) // 2 else cur_num
测试结果
执行用时:48 ms, 在所有 Python3 提交中击败了 82.01% 的用户
内存消耗:16.3 MB, 在所有 Python3 提交中击败了 5.10% 的用户
说明
算法题来源:力扣(LeetCode)