能否通过单次循环实现计算数组平均值并返回离平均值最远元素的索引及值?
能否通过单次循环实现计算数组平均值并返回离平均值最远元素的索引及值?
当然可以做到!虽然两次循环和单次循环的时间复杂度都是O(n),但这种“派对小技巧”确实挺有意思的,我来给你捋捋思路。
你之前担心用临时平均值判断会出错,这个顾虑完全没错——中途算出来的平均和最终平均可能差很多,用它来找最远元素肯定不靠谱。但其实我们可以换个更聪明的思路:对于任何数组,离平均值最远的元素一定是数组中的最大值或者最小值,因为平均值肯定落在最小值和最大值之间,极值和平均的差距必然是最大的。
基于这个结论,我们就可以在单次循环里同时完成三件事:
- 累加数组元素计算总和,用来最后求平均值
- 跟踪当前遇到的最大值及其对应的索引
- 跟踪当前遇到的最小值及其对应的索引
等遍历完数组,我们算出最终平均值后,只需要比较最大值、最小值与平均值的绝对差,哪个更大就返回对应的索引和元素值就行。
下面是Python的实现代码:
def average(nums): # 处理空数组的边界情况 if not nums: print(0) return (None, None) total = 0 # 初始化最值和对应索引为数组第一个元素 max_val = nums[0] max_idx = 0 min_val = nums[0] min_idx = 0 # 单次遍历数组 for idx, num in enumerate(nums): total += num # 更新最大值记录 if num > max_val: max_val = num max_idx = idx # 更新最小值记录 if num < min_val: min_val = num min_idx = idx # 计算最终平均值并打印 avg = total / len(nums) print(avg) # 比较哪个极值离平均更远 diff_max = abs(max_val - avg) diff_min = abs(min_val - avg) if diff_max >= diff_min: return (max_idx, max_val) else: return (min_idx, min_val)
举几个测试例子:
- 输入
[1,3,5,7,9],平均值是5,最大值9和最小值1与平均的差都是4,函数会返回(4, 9) - 输入
[2,4,6,8,10,100],平均值约为21.666,100和平均的差是78.333,是最大的,函数会返回(5, 100)
这样就完美实现了单次循环的要求,完全不需要中途判断临时平均,也不会出现你担心的“极端元素导致结果错误”的问题。
备注:内容来源于stack exchange,提问作者anf
相关产品推荐
相关产品推荐

