【问题标题】:Improving the algorithm for finding the minimum for sub-arrays of integer array.改进整数数组的子数组求最小值的算法。
【发布时间】:2014-11-16 13:42:18
【问题描述】:

今年春天,我为一家 IT 公司写了入学实习测试。下面描述了一个问题。我无法解决它,所以我需要帮助(目前我要通过新的测试,所以我需要分析我的错误)。我会很高兴得到任何帮助。

输入:一个由N个整数组成的数组arr,N - arr的长度,数字K(K

问题陈述:让我命名s_arr(int i):它是arr的子数组(长度K),它以 arr[i] 开头。

换句话说,s_arr(i){arr [i], arr [i + 1], ... arr [i + K]}

对于 offset 的所有可接受值,找到 s_arr(offset)

的最小元素>

算法复杂度应小于O(N*K)

输出:所有对(offsetmin(s_arr(offset))

例子:

输入: arr = {4, 5 ,3, 3 ,2 ,7 , 1, 5, 9}, N = 9, K = 3

输出:

(0, 3)
(1, 3)
(2, 2)
(3, 2)
(4, 1)
(5, 1)
(6, 1)

有关s_arr(i)(在本例中)的更多信息:

s_arr(0) = {4, 5, 3} -> min = 3
s_arr(1) = {5, 3, 3} -> min = 3
s_arr(2) = {3, 3, 2} -> min = 2
s_arr(3) = {3, 2, 7} -> min = 2
s_arr(4) = {2, 7, 1} -> min = 1
s_arr(5) = {7, 1, 5} -> min = 1
s_arr(6) = {1, 5, 9} -> min = 1

我的简单解决方案:

for(int i = 0; i < N - K; i++)
    int min = arr[i];
    for(int j = 0; j < K; j++)
        if (min > arr[i+j]) 
             min = arr[i+j];
    print("(" + i + "," + min + ")")

显然,复杂度是 O(N*K)。应该怎么做才能降低这个算法的复杂度?

【问题讨论】:

标签: arrays algorithm time-complexity minimum


【解决方案1】:

您应该使用之前数组中已有的信息。如果前一个数组的第一个元素 (i-1) 不是较小的,您可以简单地将上次迭代找到的最小值与当前数组的最后一个元素 (i+k-1) 进行比较。

希望对您有所帮助。

【讨论】:

  • 它并没有提高最坏情况的时间复杂度(例如,如果对初始数组进行了排序,它就没有帮助)。
【解决方案2】:

您可以使用著名的滑动窗口最小算法来实现 O(N) 复杂度。
这是一篇关于它的文章:http://people.cs.uct.ac.za/~ksmith/articles/sliding_window_minimum.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2011-11-27
    • 2012-09-04
    • 1970-01-01
    相关资源
    最近更新 更多