📅  最后修改于: 2023-12-03 15:10:14.465000             🧑  作者: Mango
给定一个长度为N的数组A,你需要找到A中所有连续的子数组中,最小值最大的那个子数组,并返回其长度。
第一行包含一个整数N,表示数组A的长度。
第二行包含N个整数,表示数组A。
输出一个整数,表示最小值最大的子数组的长度。
5
3 1 4 2 2
2
本题可以使用单调栈来解决。
维护一个单调栈,栈中存放的是数组下标。
具体实现方式为:从左到右扫描数组,对于每个元素,如果栈不为空且栈顶元素对应的元素值大于当前元素值,弹出栈顶元素,并计算以该元素为最小值的子数组长度。最终答案为所有长度中的最大值。
def max_subarray_length(arr):
n = len(arr)
stack = []
ans = 0
for i in range(n):
while stack and arr[stack[-1]] > arr[i]:
j = stack.pop()
if not stack:
ans = max(ans, i)
else:
ans = max(ans, i - stack[-1] - 1)
stack.append(i)
while stack:
j = stack.pop()
if not stack:
ans = max(ans, n)
else:
ans = max(ans, n - stack[-1] - 1)
return ans
返回的代码片段已按markdown标明。