如何在数组中寻找非第二大值的第二极大值及其对应深度?
寻找数组中的特定第二极大值
问题定义
需要定位的第二极大值并非数组全局第二大的数值,而是遵循以下逻辑的局部最大值:
- 先找到数组的第一极大值(首个峰值,即当前元素大于下一个元素的位置)
- 从该位置之后,找到数值结束持续下降阶段后出现的第一个局部最大值,同时获取其对应深度
以示例数组为例:
x = [10, 8, 6, 8, 6, 4, 2],第一极大值为10(对应深度100m)- 之后数值持续下降至6(深度60m),随后回升到8(深度40m),这个8就是目标的第二极大值
解决方案代码
def find_second_max(x, depth): # 1. 定位第一极大值的位置 first_max_idx = 0 for i in range(1, len(x)): if x[i] > x[first_max_idx]: first_max_idx = i else: # 遇到第一个比前项小的元素,确定第一极大值位置 break # 2. 找到下降阶段的结束点(数值开始回升的转折点) descent_end_idx = first_max_idx for i in range(first_max_idx + 1, len(x)): if x[i] > x[i-1]: descent_end_idx = i - 1 break else: # 若后续全程下降无回升,返回无结果 return None, None # 3. 在回升区间寻找第一个局部最大值 second_max_val = x[descent_end_idx + 1] second_max_depth = depth[descent_end_idx + 1] for i in range(descent_end_idx + 2, len(x)): if x[i] > second_max_val: second_max_val = x[i] second_max_depth = depth[i] elif x[i] < second_max_val: # 再次出现下降,说明当前局部最大值已找到 break return second_max_val, second_max_depth # 测试示例 x = [10, 8, 6, 8, 6, 4, 2] depth = [100, 80, 60, 40, 20, 10, 5] second_val, second_depth = find_second_max(x, depth) print(f"第二极大值:{second_val},对应深度:{second_depth}m")
代码说明
- 步骤1:遍历数组,找到第一个峰值(第一极大值),即当遇到首个小于前项的元素时,前项位置为第一极大值
- 步骤2:从第一极大值后继续遍历,找到数值停止下降、开始回升的转折点,确定下降阶段终点
- 步骤3:从回升点开始,寻找第一个局部最大值(再次出现下降时停止遍历),此值即为目标第二极大值
可视化验证
通过以下代码绘制曲线,可直观验证结果:
import matplotlib.pyplot as plt x = [10, 8, 6, 8, 6, 4, 2] depth = [100, 80, 60, 40, 20, 10, 5] plt.plot(x, depth, marker='o', linestyle='-') # 标记关键节点 plt.scatter(10, 100, color='red', label='第一极大值') plt.scatter(8, 40, color='green', label='第二极大值') plt.ylabel('Depth') plt.xlabel('Variable x') plt.gca().invert_yaxis() # 反转y轴,符合深度越深数值越大的直观逻辑 plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

