📌  相关文章
📜  右侧最小的较大元素(1)

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

右侧最小的较大元素

在计算机科学中,右侧最小的较大元素通常指在数组中找到一个元素x,使得该元素右侧的最小元素大于x。

在解决此问题时,可以使用单调栈数据结构来实现该算法。

单调栈

单调栈是一种特殊的栈,它可以保持栈内元素的单调性,常见的有单调递增栈和单调递减栈。

下面是单调递增栈的实现代码:

def monotonic_stack(nums):
    n = len(nums)
    stack = []
    res = [-1] * n
    
    for i in range(n):
        while stack and nums[i] > nums[stack[-1]]:
            res[stack.pop()] = nums[i]
        stack.append(i)
        
    return res
算法思路
  • 从右侧开始遍历数组,使用单调递增栈存储每个未处理的元素的下标。
  • 对于每个元素,弹出栈顶部的元素,直到找到一个右侧比它大的元素,将其存储到结果数组中。
  • 如果未找到,则将结果数组中该元素的值设置为-1。
实现代码
def find_right_minimum(nums):
    n = len(nums)
    stack = []
    res = [-1] * n
    
    for i in reversed(range(n)):
        while stack and nums[i] >= nums[stack[-1]]:
            stack.pop()
        if stack:
            res[i] = nums[stack[-1]]
        stack.append(i)
        
    return res
测试样例
assert find_right_minimum([12, 13, 1, 5, 3, 10, 6]) == [13, -1, 5, 10, 10, -1, -1]
assert find_right_minimum([1, 2, 3, 4, 5, 6]) == [2, 3, 4, 5, 6, -1]
assert find_right_minimum([6, 5, 4, 3, 2, 1]) == [-1, -1, -1, -1, -1, -1]

以上是右侧最小的较大元素的介绍和实现代码。通过单调递增栈的思想,我们可以在O(n)的时间复杂度内解决这个问题。