当前位置: 首页 > 知识库问答 >
问题:

寻找最小射程的子阵

吕霖
2023-03-14

给定一个由N个正整数组成的数组,从索引0到N-1,我如何才能找到一个长度为K且范围尽可能小的连续子数组。换句话说,最大(子阵列)-最小(子阵列)是最小化的。如果有多个答案,任何答案都可以。

例如,从[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)

共有2个答案

公良向阳
2023-03-14

可以使用numpy来提高执行时间。

例子:

def f1(l,k):
    subs = np.array([l[i:i+k] for i in range(len(l)-k+1)])
    return np.min(subs.max(axis=1) - subs.min(axis=1))

测试f2是您在这里的函数)。

>>> arr = np.random.randint(100,size=10000)
>>> timeit.timeit("f1(arr,4)",setup="from __main__ import f1,f2,np,arr",number=1)
0.01172515214420855
>>> timeit.timeit("f2(arr,4)",setup="from __main__ import f1,f2,np,arr",number=1)
14.226237731054425
万俟渝
2023-03-14

有一种线性时间算法O(N)用于在指定大小的移动窗口中获得最小值或最大值(而您的实现具有O(N*K)复杂性)

使用collections模块中的deque,您可以实现两个并行deque,为当前窗口位置保持最小值和最大值,并在仅遍历列表后检索最佳差异。

import collections

def mindiff(a, k):
    dqmin = collections.deque()
    dqmax = collections.deque()
    best = 100000000
    for i in range(len(a)):
        if len(dqmin) > 0 and dqmin[0] <= i - k:
            dqmin.popleft()
        while len(dqmin) > 0 and a[dqmin[-1]] > a[i]:
            dqmin.pop()
        dqmin.append(i)
        if len(dqmax) > 0 and dqmax[0] <= i - k:
            dqmax.popleft()
        while len(dqmax) > 0 and a[dqmax[-1]] < a[i]:
            dqmax.pop()
        dqmax.append(i)
        if i >= k - 1:
            best = min(best, a[dqmax[0]]-a[dqmin[0]])
    return best

print(mindiff([4, 1, 2, 6], 2))
 类似资料:
  • 解决此问题的最佳方法(性能方面)是什么?有人建议我使用后缀树。这是最好的方法吗?

  • 问题内容: 来自dagger-discuss @: 我有一个类,它从对象图中获取一些依赖关系,而在运行时从调用者那里获取其他依赖关系。 我想出了一个解决方案,定义了一个工厂, 现在,我不再注入客户端的构造函数,而是直接注入并调用其方法。 如您所见,这很冗长且冗长。它还有很多重复和样板。使用来注释字段本身存在一些障碍,因此让我们暂时忽略这种可能性。 Square人员使用提供程序提出了一个有趣的解决方

  • 下面是寻找最小跳跃次数的算法谜题。发布了详细的问题声明和两个代码版本来解决这个问题。我做了测试,似乎两个版本都可以工作,我的第二个版本是版本一代码的优化版本,这使得我从开始,而不是持续增加,这可以通过不迭代所有的插槽来节省时间数组。 我的问题是,想知道我的第二个版本代码是否100%正确?如果有人发现任何逻辑问题,请指出。 问题陈述 给定一个非负整数数组,您最初位于数组的第一个索引处。 数组中的每个

  • 如何在数据集中找到几个最小值中的第一个?我希望至少2大于最小值。 例如, 我想将df['value'][0]或者简单地说(0.6)标识为这个数组中的第一个最小值。然后将df[‘值’][4]或(2.8)确定为至少比第一个确定的最小值(0.6)大2的值。 这适用于其他数据集,但在最小值为第一个时不适用。 理想的输出是: 正如评论中建议的那样,循环将是更好的方法。

  • 我试图解决这个面试问题。我的代码针对测试用例运行,但对于所有实际输入测试用例都失败。我努力寻找错误,但无法做到。请在问题下方找到我的代码 鲍勃非常喜欢分类。他总是在想新的方法来对数组进行排序。他的朋友拉姆给了他一项艰巨的任务。他给了Bob一个数组和一个整数K。挑战是在最多K-swap之后生成字典序最小数组。只能交换连续的元素对。帮助Bob在最多K-swap之后返回字典序最小数组。 输入:第一行包含

  • 我有一个熊猫数据框,有两列,一列是温度,另一列是时间。 我想做第三和第四列,叫做最小和最大。这些列中的每一个都将填充nan's,除非有一个局部min或max,那么它将具有该极值的值。 这里是一个数据的样本,本质上我试图识别图中所有的峰值和低点。 有没有内置的熊猫工具可以做到这一点?