📅  最后修改于: 2023-12-03 15:42:15.669000             🧑  作者: Mango
这是 Gate-CS-2004 的第 83 题,题目描述如下:
给定一个由 n 个元素组成的数组 arr[] 和一个整数 k。数组中的元素可能不是唯一的。找到在数组中出现次数超过 n/k 次的元素(元素出现的次数必须超过整数除以 k)。如果数组中没有元素出现次数超过 n/k 次,则不返回任何内容。
这道题可以使用摩尔投票算法来解决。类似于找到出现次数超过一半的元素,我们用一个变量 candidate 记录当前的候选元素,用另一个变量 count 统计 candidate 的出现次数。
遍历一遍数组,每次判断当前的元素是否与 candidate 相等,如果相等则将 count 加一,否则将 count 减一。当 count 减到零时,我们将 candidate 替换成当前的元素,同时将 count 设置为 1。
遍历完成后,我们得到的 candidate 就是出现次数超过 n/k 的元素。但还需要一个最后的扫描来确认 candidate 的出现次数是否真的超过了 n/k。
具体实现可以参考下面的代码片段。
def find_majority(arr, k):
n = len(arr)
cnts = {}
for i in range(n):
if arr[i] in cnts:
cnts[arr[i]] += 1
else:
cnts[arr[i]] = 1
ans = []
threshold = n // k
for key, val in cnts.items():
if val > threshold:
ans.append(key)
return ans if ans else "No majority element"
# 使用摩尔投票算法的解法
def find_majority_voting(arr, k):
n = len(arr)
candidate = count = 0
for i in range(n):
if candidate == arr[i]:
count += 1
elif count > 0:
count -= 1
else:
candidate = arr[i]
count = 1
cnt = 0
for i in range(n):
if arr[i] == candidate:
cnt += 1
return [candidate] if cnt > n // k else "No majority element"