📌  相关文章
📜  找到下一个更大的数字,每个 Array 元素恰好有两个唯一数字(1)

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

找到下一个更大的数字,每个 Array 元素恰好有两个唯一数字

有一个数组,每个元素都是由两个唯一数字构成的。我们需要找到每个元素的“下一个更大的数字”,即在数组中,比当前元素大的下一个元素。如果没有比当前元素更大的下一个元素,将其值设为-1。这个问题可以使用单调栈进行解决。

单调栈的概念

单调栈是一种数据结构,它是一个栈,其中所有的元素都是单调递增或递减的。当需要找到数组中元素的下一个更大/小的数字时,可以使用单调栈。

单调栈中的元素可以是数组索引或元素本身,具体取决于问题的具体要求。

解决问题的思路

对于每个元素,我们需要找到比它大的下一个元素。我们可以使用单调递减栈。这样,如果元素比栈顶元素小,那么我们就将它压入栈中。如果元素比栈顶元素大,则我们不断将栈顶元素出栈,直到我们找到一个比当前元素大的元素。

对于该问题,我们可以对数组进行两次遍历:

  • 第一遍遍历,我们将所有元素的下一个更大的数字设为-1,并将所有元素的索引压入单调递减栈中。

  • 第二遍遍历,我们从右往左遍历元素。对于每个元素,我们弹出栈中所有比它小的元素。最后,栈顶元素就是该元素的下一个更大的数字。

代码实现
def next_greater_element(nums):
    # 创建一个单调递减栈存储索引
    stack = []
    n = len(nums)
    # 初始化下一个更大的数字为-1
    res = [-1] * n

    # 第一遍遍历
    for i in range(n):
        while stack and nums[stack[-1]] < nums[i]:
            res[stack.pop()] = i  # 栈顶元素的下一个更大的数字是当前元素
        stack.append(i)

    # 第二遍遍历
    for i in range(n-1, -1, -1):
        while stack and nums[stack[-1]] < nums[i]:
            stack.pop()
        if stack:
            # 栈顶元素就是下一个更大的数字
            res[i] = nums[stack[-1]]
        stack.append(i)

    return res
总结

单调栈是解决类似问题的有效工具。我们可以使用它来找到数组中每个元素的下一个更大/小的数字。在实践中,我们需要仔细考虑问题的具体要求,来确定单调栈中存储的元素是数组索引还是元素本身。