📅  最后修改于: 2023-12-03 15:37:41.561000             🧑  作者: Mango
有一个长度为 n 的循环数组 nums,你需要从数组中的第 i 个元素开始(其中 0 ≤ i < n),查找下一个更大的元素,如果找不到,则将该元素输出为 -1。循环数组意味着最后一个元素的下一个元素是第一个元素。此外,利用快捷方式来解决问题非常困难,因此你需要找到循环数组中下一个更大的元素的循环距离,即到达第一个更大元素时要绕过数组中的所有其他元素。
首先,在这个问题中,输入是一个数组和一个索引。我们需要使用单调栈来查找下一个更大的元素。我们可以按照以下方式执行此操作:
从输入数组的 index 开始遍历数组,将第一个元素插入栈中,并将循环数组的长度设为 n。
继续遍历数组,将每个元素和栈顶元素比较。如果它比栈顶元素大,则弹出栈顶元素,并将该元素设为下一个更大的元素。然后,将该元素添加到栈中。如果该元素比栈顶元素小,则将该元素添加到栈中。
如果到达数组的末尾时还没有找到下一个更大的元素,则需要将循环数组的前面元素添加到栈中,并重新从数组开头开始遍历数组。直到找到下一个更大的元素或者栈为空为止。
以下为实现上述算法的 Python 代码。代码中使用了一个列表作为栈来实现单调栈。
def next_greater_element(nums, index):
n = len(nums)
stack = []
res = [-1] * n
for i in range(index, index - n, -1):
while stack and stack[-1][1] < nums[i]:
res[stack.pop()[0]] = nums[i]
stack.append((i % n, nums[i]))
return res
在此处使用的算法的时间复杂度为 O(n)。