📜  门| GATE-CS-2004 |第 83 题(1)

📅  最后修改于: 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"

参考资料