You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中从峰谷序列列表里查找下一个更小的数

在Python中查找列表元素的下一个更小值

给定数组:Array = [3, 6, 5, 7, 2, 4, 3, 5, 4, 5, 4, 7, 6, 7, 1, 7, 4, 6, 3],需求为数组中每个元素找到其右侧第一个比它小的元素;若不存在这样的元素,用-1标记。

示例参考

数值序列:3, 6, 5, 7, 2, 4, 3, 5, 4, 5, 4, 7, 6, 7, 1, 7, 4, 6, 3
谷(valley)/峰(Peak):v, p, v, p, v, p, v, p, v, p, v, p, v, p, v, p, v, p, v

高效实现方案(单调栈)

暴力遍历的时间复杂度为O(n²),而使用单调栈可以将时间复杂度优化至O(n),具体实现代码如下:

def find_next_smaller(arr):
    n = len(arr)
    result = [-1] * n
    stack = []
    
    # 从右往左遍历数组
    for i in range(n-1, -1, -1):
        # 弹出栈中所有不小于当前元素的元素,这些元素无法成为当前元素的下一个更小值
        while stack and stack[-1] >= arr[i]:
            stack.pop()
        # 栈不为空时,栈顶即为第一个更小的元素
        if stack:
            result[i] = stack[-1]
        # 将当前元素压入栈,作为左侧元素的候选值
        stack.append(arr[i])
    return result

# 测试给定数组
target_array = [3, 6, 5, 7, 2, 4, 3, 5, 4, 5, 4, 7, 6, 7, 1, 7, 4, 6, 3]
next_smaller_values = find_next_smaller(target_array)

print("原数组:", target_array)
print("下一个更小值序列:", next_smaller_values)

代码说明

  • 初始化result数组,默认值设为-1,代表无符合条件的元素。
  • 从右往左遍历数组,利用栈维护一个单调递增序列:栈中始终保存当前元素右侧可能成为“下一个更小值”的候选元素。
  • 对每个元素,先清除栈中所有大于等于它的元素(这些元素不可能是当前元素的目标值),此时栈顶元素即为第一个更小值;若栈为空则保持-1。
  • 将当前元素压入栈,为左侧元素提供候选。

运行结果

原数组: [3, 6, 5, 7, 2, 4, 3, 5, 4, 5, 4, 7, 6, 7, 1, 7, 4, 6, 3]
下一个更小值序列: [2, 5, 2, 2, -1, 3, 1, 4, 1, 4, 1, 6, 1, 1, -1, 4, 3, 3, -1]

内容的提问来源于stack exchange,提问作者Samuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:10:38