【发布时间】:2020-05-01 21:42:19
【问题描述】:
给定一个由 N 个正整数组成的数组,范围从索引 0 到 N - 1,我如何才能找到一个长度为 K 且具有最小范围的连续子数组。换句话说, max(subarray) - min(subarray) 被最小化。如果有多个答案,任何一个都可以。
例如,从[4, 1, 2, 6]中找到最小范围为2的子数组
答案是 [1, 2],因为 2 - 1 = 1 给出了所有可能的连续子数组的最小范围。
其他子数组是[4, 1](范围3),[2, 6](范围4)
我正在使用 python,到目前为止,我已经尝试使用 min() max() 函数进行线性搜索,但这样做似乎效率不高。我曾考虑过使用 minheap,但我不确定你将如何实现它,我什至不确定它是否会起作用。任何帮助将不胜感激。
编辑:添加代码
# N = length of array_of_heights, K = subarray length
N, K = map(int, input().split(' '))
array_of_heights = [int(i) for i in input().split(' ')]
min_min = 100000000000000000000
# iterates through all subarrays in the array_of_heights of length K
for i in range(N + 1 - K):
subarray = land[i : i + K]
min_min = min(max(subarray)-min(subarray), min_min)
print(min_min)
【问题讨论】:
-
你为此做了什么?你能分享你的代码吗?
-
代码已添加,谢谢。
-
我认为你必须保持一个大小为
k的窗口,同时像滑动窗口一样沿着数组迭代。 -
你需要一个 minheap 和一个 maxheap。并且代码将实现一个滑动窗口。当一个元素进入窗口时,它应该被添加到两个堆中。当最大值离开窗口时,它应该从 maxheap 中移除。 maxheap 中已经在窗口之外的其他元素也应该被删除。最低限度也是如此。
标签: python arrays algorithm range