logo头像
Snippet 博客主题

【Leetcode 229】Majority Element2

难度: 中等(Medium)

题目:Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

思路:现在要求找出出现次数大于n/3的数字,那么这个数字可能不存在,可能有1个,也可能有2个。如果不要求空间复杂度是O(1)的话,只要扫描一遍数组统计各个数字出现的次数即可。但要求O(1)空间复杂度就只能通过维护几个计数器来完成任务,那么就应该通过一种方法来缩小候选的数字集合,缩小到常数个。所采用的方法与169题相似,每次删除三个不同的数字,直到不存在三个不同的数字。这时要注意的是,满足要求的数字一定出现在剩余数字中,但是剩余数字不一定都满足要求,可通过再一次扫描数组,统计出剩余的数字出现的次数,判断是否满足要求即可。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
if nums == None:
return None
result = []
num_counter = {}
for n in nums:
if n in num_counter:
num_counter[n] += 1
elif len(num_counter) < 2:
num_counter[n] = 1
else:
for k,v in num_counter.items():
if v == 1:
num_counter.pop(k)
else:
num_counter[k] -= 1
for k in num_counter.keys():
num_counter[k] = 0
for n in nums:
if n in num_counter:
num_counter[n] += 1
for k,v in num_counter.items():
if v > len(nums)/3:
result.append(k)
return result

评论系统未开启,无法评论!