📌  相关文章
📜  下一个较小的元素(1)

📅  最后修改于: 2023-12-03 15:21:28.924000             🧑  作者: Mango

下一个较小的元素

在一个数组中,对于每个元素,找到比它小的下一个元素。

例如:

输入: [4, 5, 2, 10, 8]

输出: [2, 2, -1, 8, -1]

在本题中,输入的数组长度最多为10000,数组中的元素取值范围为[-1000000, 1000000]。

解法一:暴力枚举

暴力枚举的思路很简单,对于每一个元素,向后遍历数组,找到第一个比它小的元素。如果找到了,就将这个元素的值加入到结果数组中,否则,则将-1加入到结果数组中。

时间复杂度为 $O(n^2)$。

def next_smaller_element(nums):
    """
    :type nums: List[int]
    :rtype: List[int]
    """
    n = len(nums)
    ans = []
    for i in range(n):
        j = i + 1
        while j < n:
            if nums[j] < nums[i]:
                ans.append(nums[j])
                break
            j += 1
        else:
            ans.append(-1)
    return ans
解法二:单调栈

单调栈是一类特殊的栈,它的特殊之处在于栈内的元素是有序的。如果要求下一个更小的元素,那么我们可以利用单调栈来维护一个递增的栈。遍历到一个元素时,如果它比栈顶元素小,那么就说明栈顶元素的下一个比它小的元素就是当前元素,将栈顶元素出栈,并将当前元素加入到结果数组中。如果当前元素比栈顶元素大,就将当前元素入栈。

时间复杂度为 $O(n)$。

def next_smaller_element(nums):
    """
    :type nums: List[int]
    :rtype: List[int]
    """
    n = len(nums)
    ans = [-1] * n
    stack = []
    for i in range(n):
        while stack and nums[i] < nums[stack[-1]]:
            ans[stack.pop()] = nums[i]
        stack.append(i)
    return ans
总结

本题可以通过暴力枚举和单调栈两种方法来求解。其中,单调栈的时间复杂度更优,为 $O(n)$。

如果想要更深入地学习单调栈的相关知识,可以参考以下链接:

数据结构-单调栈