
本文讲解如何仅使用基础数组结构,在 o(n) 时间复杂度内高效找出数组中最大元素的出现频次,纠正“双重循环必为 o(n²)”的常见误解,并提供可直接运行的实现示例与关键注意事项。
本文讲解如何仅使用基础数组结构,在 o(n) 时间复杂度内高效找出数组中最大元素的出现频次,纠正“双重循环必为 o(n²)”的常见误解,并提供可直接运行的实现示例与关键注意事项。
在算法实践中,一个常见误区是将“两次独立遍历”错误等价于“嵌套循环”,从而误判时间复杂度。事实上,对同一数组先后执行两次单层 for 循环,其总时间复杂度仍为 O(n),而非 O(n²)。这是因为:
- 第一次遍历(找最大值)耗时:O(n)
- 第二次遍历(统计该最大值出现次数)耗时:O(n)
- 总耗时 = O(n) + O(n) = O(2n) = O(n)(常数因子在渐进分析中被忽略)
✅ 正确解法(单数组、零额外数据结构):
def count_max_duplicates(arr):
if not arr:
return 0
# 第一遍:找出最大值
max_val = arr[0]
for num in arr[1:]:
if num > max_val:
max_val = num
# 第二遍:统计最大值出现次数
count = 0
for num in arr:
if num == max_val:
count += 1
return count
# 示例调用
nums = [3, 7, 2, 7, 1, 7, 4]
print(count_max_duplicates(nums)) # 输出:3(最大值 7 出现 3 次)⚠️ 关键注意事项:
- 不可合并为“一次遍历”来同时更新最大值和计数——因为最大值可能在遍历中途被更新,此前统计的旧最大值频次即失效;必须先确定最终最大值,再统一计数。
- 若需同时返回最大值及其频次,可封装为元组 return (max_val, count),不增加复杂度。
- 边界处理必不可少:空数组、单元素数组均需兼容(示例已覆盖)。
- 本方案空间复杂度为 O(1),严格满足“仅使用数组”的约束,无需哈希表、字典或辅助数组。
? 总结:
面对“仅用数组”的限制,最优解就是两趟线性扫描——简洁、稳健、理论最优。它既避免了 O(n²) 的暴力比对,又绕开了哈希结构的额外开销。理解“顺序执行 ≠ 嵌套执行”是掌握时间复杂度分析的关键一步。










