如何优化实现固定最大值的数组元素最小间距调整
问题描述
给定一个有序float数组(元素位置对应图表展示顺序,需保持位置不变),要求:
- 数组最大值不可调整
- 所有元素间至少保持指定最小间隔
- 其余元素可调整以满足间距规则,维持原有位置顺序
原代码可处理短数组,但存在无法适配长度大于3的数组、遇到重复值会进入死循环的问题,需优化实现。
原代码问题分析
- 使用
values.index(next_value)获取索引,当数组存在重复值时,会始终返回第一个匹配的索引,导致重复处理同一位置,无法退出循环 - 依赖while循环逐个查找最大值,代码冗余且效率较低
- 未考虑重复值场景的处理逻辑,扩展性差
优化实现方案
以下是更简洁、符合Python风格的实现,能处理任意长度数组及重复值场景:
def adjust_spacing(values, minimum_spacing): # 将元素与索引绑定,便于后续按原位置赋值 indexed_values = list(enumerate(values)) # 找到最大值对应的索引和值 max_idx, max_val = max(indexed_values, key=lambda x: x[1]) # 将除最大值外的元素按原数值从大到小排序(数值相同时按索引排序,避免重复处理) sorted_rest = sorted( (item for item in indexed_values if item[0] != max_idx), key=lambda x: (-x[1], x[0]) ) # 初始化结果数组,保留原数组结构 result = values.copy() current_upper = max_val # 依次为排序后的元素分配满足间隔要求的值 for idx, _ in sorted_rest: current_upper -= minimum_spacing result[idx] = current_upper return result
代码逻辑说明
- 绑定索引与值:用
enumerate将每个元素的索引和值配对,确保后续能准确放回原位置 - 定位最大值:通过
max函数直接找到最大值的索引和值,无需额外遍历 - 排序剩余元素:按原数值降序、索引升序排序,保证从最接近最大值的元素开始调整
- 分配调整后的值:从最大值开始,依次减去最小间隔,赋值给对应的索引位置,确保所有元素间距满足要求
测试示例
# 基础示例 values = [99.3, 100.0, 98.6] print(adjust_spacing(values, 4)) # 输出: [96.0, 100.0, 92.0] # 长度为4的数组 values = [90, 100, 95, 92] print(adjust_spacing(values, 4)) # 输出: [88, 100, 96, 92] # 含重复值的数组 values = [100, 95, 95, 90] print(adjust_spacing(values, 4)) # 输出: [100, 96, 92, 88]
内容的提问来源于stack exchange,提问作者ocodo
相关产品推荐
相关产品推荐

