📅  最后修改于: 2023-12-03 15:13:29.536000             🧑  作者: Mango
在使用数组时,可能会遇到需要寻找某个索引的最大范围子数组的情况。这种情况下,我们需要找到数组中的一个子数组,使得这个子数组内的最小值即为该索引处的值。为了找到这个子数组,我们可以使用单调栈来优化时间复杂度。
下面是Python代码的实现,其中get_min_range
函数接受一个数组A,返回一个列表ans,其中ans[i]
表示以i为索引的最大范围子数组。
def get_min_range(A):
n = len(A)
left, right = [-1] * n, [n] * n
stack = []
for i in range(n):
while stack and A[stack[-1]] >= A[i]:
stack.pop()
if stack:
left[i] = stack[-1]
stack.append(i)
stack = []
for i in range(n - 1, -1, -1):
while stack and A[stack[-1]] >= A[i]:
stack.pop()
if stack:
right[i] = stack[-1]
stack.append(i)
ans = []
for i in range(n):
ans.append(A[left[i]+1:right[i]])
return ans
在单调栈的过程中,每个元素只会进栈出栈一次,因此时间复杂度为O(n)。