📅  最后修改于: 2023-12-03 15:25:50.116000             🧑  作者: Mango
有一个数组,每个元素都是由两个唯一数字构成的。我们需要找到每个元素的“下一个更大的数字”,即在数组中,比当前元素大的下一个元素。如果没有比当前元素更大的下一个元素,将其值设为-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
单调栈是解决类似问题的有效工具。我们可以使用它来找到数组中每个元素的下一个更大/小的数字。在实践中,我们需要仔细考虑问题的具体要求,来确定单调栈中存储的元素是数组索引还是元素本身。