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

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

在圆形数组中找到下一个更大的元素
介绍

在一个圆形数组中找到下一个更大的元素,可以理解为在一个环形的数据结构中,给定一个元素,需要找到它在环形数组中的下一个更大的元素。这是一道非常经典的算法问题,在算法面试中经常被问到。

解法

暴力解法

最简单直接的方法是使用暴力枚举,对于每个元素,从它的下一个元素开始遍历整个数组,查找是否有更大的元素。如果找到了,就将它赋值为当前元素的下一个更大的元素。如果没找到,就将它赋值为-1。

def next_greater_element_circular_array(arr):
    n = len(arr)
    res = [-1] * n
    for i in range(n):
        for j in range(i+1, i+n):
            if arr[j%n] > arr[i]:
                res[i] = arr[j%n]
                break
    return res

时间复杂度为O(n^2),空间复杂度为O(n)。

单调栈解法

一个更优的解法是使用单调栈。具体思路如下:

首先,我们需要将数组重复复制一份,来模拟原数组环形的特性。

然后,我们从左往右遍历数组,使用单调栈来存储元素的索引。

对于每个元素,我们将它与栈顶元素进行比较,如果它比栈顶元素大,那么就将栈顶元素弹出,并将它对应的答案设为当前元素的值。

最后,我们遍历完整个数组,但是栈中可能还存在一些元素,它们的答案应该赋值为-1。

下面是代码实现:

def next_greater_element_circular_array(arr):
    n = len(arr)
    res = [-1] * n
    stack = []
    for i in range(2*n-1):
        while stack and arr[stack[-1]%n] < arr[i%n]:
            res[stack.pop()] = arr[i%n]
        stack.append(i)
    return res

时间复杂度为O(n),空间复杂度为O(n)。

总结

在圆形数组中找到下一个更大的元素其实是一道比较有趣的算法问题。本文介绍了两种解法,暴力解法和单调栈解法。其中单调栈解法是一种非常优秀的解法,时间复杂度为O(n),空间复杂度也为O(n)。如果你正在准备算法面试,建议多多掌握这道题目,因为它是非常经典的。