📜  在圆形数组中查找下一个更大的元素(1)

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

在圆形数组中查找下一个更大的元素

问题描述

给定一个循环数组(最后一个元素的下一个元素是第一个元素),输出每个元素的下一个更大元素。若不存在,则输出 -1。

举个例子,输入数组 [2, 4, 3, 1, 5, 6],输出数组 [4, 5, 5, 5, 6, 2]。解释:对于数组中的第一个元素 2,下一个更大的元素是 4;对于数组中的第二个元素 4,下一个更大的元素是 5;以此类推。

解决方案

我们可以使用单调栈来解决该问题。我们可以通过将数组循环两次,来模拟循环数组,即构造新的数组 nums2 = nums + nums。对于新数组中第 i 个元素,我们需要找到其下一个更大元素,即比它大的第一个数。因为该数组是循环数组,因此我们可以使用取模的方式来获取原数组中对应的元素。

具体来说,我们可以维护一个单调不升栈,存储的是元素在新数组中的下标。对于新数组中的每个元素,我们依次将其与栈顶元素相比较。如果当前元素比栈顶元素大,那么我们可以将栈顶元素出栈,并将栈顶元素在原数组中对应的元素的下一个更大元素设为当前元素。我们重复这个过程,直到当前元素小于等于栈顶元素为止,然后将当前元素入栈。

最后,对于未找到下一个更大元素的元素,我们将其下一个更大元素设为 -1。

下面是该算法的 Python 实现代码:

def nextGreaterElements(nums):
    n = len(nums)
    res = [-1] * n
    stack = []
    for i in range(2 * n):
        while stack and nums[stack[-1]] < nums[i % n]:
            res[stack.pop()] = nums[i % n]
        stack.append(i % n)
    return res
复杂度分析
  • 时间复杂度:$O(n)$,其中 $n$ 是数组的长度。我们需要遍历两次数组,并对于每个元素最多入栈出栈一次,时间复杂度为 $O(n)$。
  • 空间复杂度:$O(n)$,其中 $n$ 是数组的长度。最坏情况下,栈中会存储所有元素的下标,因此空间复杂度为 $O(n)$。