改进查找整数数组子阵列最小值的算法。

时间:2014-09-22 14:32:48

标签: arrays algorithm time-complexity minimum

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

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

问题陈述:让我命名 s_arr(int i) arr 的子阵列(长度K) em>,以 arr [i] 开头。

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

对于 偏移 的所有允许值,找到 s_arr(偏移)的最小元素

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

输出所有对( 偏移 min(s_arr(偏移

示例:

输入: 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)。应该怎么做才能降低这种算法的复杂性?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

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

希望有所帮助。