📅  最后修改于: 2023-12-03 15:12:40.096000             🧑  作者: Mango
给定一个由 $n$ 个正整数构成的序列 $a_1, a_2, \cdots, a_n$,一个长度为 $s$ 的区间的众数定义为出现次数大于 $\lfloor \frac{s}{2} \rfloor$ 的数。现在请你写一个程序,输出从左往右依次扫描每个长为 $w$ 的区间的众数。
第一行包含两个正整数 $n$ 和 $w$,表示序列长度和区间长度。
第二行包含 $n$ 个整数,表示给定的序列。
共输出 $n-w+1$ 行,每行一个整数,表示从左往右每个长为 $w$ 的区间的众数。
$1 \leq n, w \leq 10^5$, $1 \leq a_i \leq 10^8$。
9 3
1 1 1 2 2 3 3 3 3
1
1
2
3
3
3
3
题目要求求出每个长度为 $w$ 的区间的众数,不难想到用库函数及字典来解决问题。具体步骤如下:
from collections import defaultdict
def majority_number(n, w, nums):
nums_count = defaultdict(int)
max_count = 0
max_num = None
res = []
for i in range(n):
# 记录当前区间内每个数字出现的次数
num = nums[i]
nums_count[num] += 1
# 如果当前数字成为出现次数最大的数字,就更新 max_count 和 max_num
if nums_count[num] > max_count:
max_count = nums_count[num]
max_num = num
# 如果当前区间已经处理完了,就看看出现次数最大的数字是否符合众数的定义
if i >= w - 1:
if max_count > w // 2:
res.append(max_num)
else:
res.append(next(iter(nums_count))))
# 如果没有众数,就输出区间中的任意一个数
# 将区间最左边的数字从字典中删除,准备处理下一个区间
left_num = nums[i - w + 1]
nums_count[left_num] -= 1
if nums_count[left_num] == 0:
del nums_count[left_num]
max_count = 0
max_num = None
return res