LeetCode229. 求众数 II
今天的每日一题来自229. 求众数 II,采用摩尔投票方法实现O(1)空间复杂度求解
- 题目:给定一个大小为 n 的整数数组,找出其中所有出现超过
⌊ n/3 ⌋
次的元素。 - 示例:输入:[1,1,1,3,3,2,2,2] 输出:[1,2]
很容易想到用哈希表记录每个数字出现次数,最后遍历查找出现次数>[n/3]的数字,这样写时间复杂度为O(n),空间复杂度为O(n)
使用摩尔投票法能够实现将空间复杂度优化到O(1),摩尔投票算法在LeetCode169. 多数元素中出现过,查找出现超过 ⌊ n/2 ⌋
次的元素的代码并不复杂,但应用到查找出现超过 ⌊ n/k ⌋
次的元素情况下需要更全面考虑条件分支的写法。
1 class Solution: 2 def majorityElement(self, nums: List[int]) -> List[int]: 3 res,n = [],len(nums) 4 n1,n2 = 0,0 5 v1,v2 = 0,0 6 for num in nums: 7 if v1>=0 and num==n1: 8 v1 += 1 9 elif v2>=0 and num==n2: 10 v2 += 1 11 elif v1==0: 12 n1 = num 13 v1 += 1 14 elif v2==0: 15 n2 = num 16 v2 += 1 17 else: 18 v1 -= 1 19 v2 -= 1 20 21 #统计n1、n2实际出现次数,elif确保n2=n1时不会被统计 22 v1,v2 = 0,0 23 for num in nums: 24 if num==n1: v1 += 1 25 elif num==n2: v2 += 1 26 27 if v1>n//3: res.append(n1) 28 if v2>n//3: res.append(n2) 29 return res