📅  最后修改于: 2023-12-03 15:39:45.907000             🧑  作者: Mango
这是一个常见的问题,可以用单调栈来解决。单调栈是一个栈,其中存储的元素是单调递增或单调递减的。对于本问题,我们需要维护一个从栈底到栈顶单调递减的栈,栈中的元素是数组的下标。
首先,我们遍历数组,对于每个元素,我们在栈顶弹出所有小于它的元素,并计算它们和右边第一个小于它的元素之间的差异,取所有差异的最大值即可。
代码如下:
def max_difference(arr):
"""
找到最近的左右较小元素之间的最大差异
:param arr: 数组
:return: 最大差异
"""
stack = []
max_diff = 0
for i in range(len(arr)):
while stack and arr[stack[-1]] > arr[i]:
j = stack.pop()
if stack:
max_diff = max(max_diff, arr[j] - arr[stack[-1]])
else:
max_diff = max(max_diff, arr[j])
stack.append(i)
while stack:
j = stack.pop()
if stack:
max_diff = max(max_diff, arr[j] - arr[stack[-1]])
else:
max_diff = max(max_diff, arr[j])
return max_diff
这个算法的时间复杂度是O(n),空间复杂度O(n)。