以下是一个不进行替换的滚动最小值的解决方法的代码示例:
def find_min(nums, k):
n = len(nums)
result = []
window = []
# 初始化滑动窗口
for i in range(k):
while window and nums[i] < nums[window[-1]]:
window.pop()
window.append(i)
# 处理剩余元素
for i in range(k, n):
result.append(nums[window[0]])
# 移除滑动窗口中已经离开的元素
while window and window[0] <= i - k:
window.pop(0)
# 添加当前元素到滑动窗口中
while window and nums[i] < nums[window[-1]]:
window.pop()
window.append(i)
result.append(nums[window[0]])
return result
# 测试示例
nums = [4, 3, 5, 4, 3, 3, 6, 7]
k = 3
print(find_min(nums, k)) # 输出: [3, 3, 3, 3, 3, 3]
该方法使用滑动窗口的思想,维护一个递增的双端队列window
来保存当前滑动窗口中的最小值的索引。在初始化滑动窗口时,从左到右遍历前k
个元素,将大于等于当前元素的索引从队尾弹出,再将当前元素的索引加入队尾。然后,从第k
个元素开始遍历,每次都将滑动窗口中的最小值加入结果列表result
,然后移除滑动窗口中已经离开的元素的索引,并将大于等于当前元素的索引从队尾弹出,再将当前元素的索引加入队尾。最后,返回结果列表result
。