📅  最后修改于: 2023-12-03 14:54:26.261000             🧑  作者: Mango
给定一个数组,需要找到所有可能长度的每个子数组中存在的最小元素。
我们可以采用单调栈来实现代码。
遍历整个数组,使用一个栈来维护从左往右遍历过的最小值。当遍历到一个新的元素时,将其与栈顶元素比较:
在上述过程中,我们始终保证栈内元素是单调递增的。
def find_min_elements(nums):
results = []
stack = []
for i, num in enumerate(nums):
while stack and num < nums[stack[-1]]:
j = stack.pop()
if stack:
results.append((i - stack[-1] - 1) * nums[j])
else:
results.append(i * nums[j])
stack.append(i)
n = len(nums)
while stack:
j = stack.pop()
if stack:
results.append((n - stack[-1] - 1) * nums[j])
else:
results.append(n * nums[j])
return results
输入:[3, 1, 2, 4]
输出:[3, 1, 2, 1, 2, 4]
解释:
- 对于子数组 [3],最小元素是 3,长度为 1,结果为 3;
- 对于子数组 [1, 2, 4],最小元素是 1,长度为 3,结果为 3;
- 对于子数组 [3, 1],最小元素是 1,长度为 2,结果为 2;
- 对于子数组 [2, 4],最小元素是 2,长度为 2,结果为 4;
- 对于子数组 [1, 2],最小元素是 1,长度为 2,结果为 2;
- 对于子数组 [2],最小元素是 2,长度为 1,结果为 2。
本篇文章介绍了使用单调栈来寻找所有可能长度的每个子数组中存在的最小元素的方法,通过协助递增栈及栈操作来实现该功能。