今年春天,我为一家IT公司写了入门实习考试。存在下述问题。我无法解决它,所以我需要帮助(目前我要通过新的测试,所以我需要分析我的错误)。我会很高兴得到任何帮助。
输入:N个整数的数组 arr ,N - arr 的长度和数字K(K 问题陈述:让我命名 s_arr(int i): arr 的子阵列(长度K) em>,以 arr [i] 开头。 换句话说, s_arr(i)是 对于 偏移 的所有允许值,找到 s_arr(偏移)的最小元素 算法的复杂度应小于O(N * K) 输出所有对( 偏移 , min(s_arr(偏移)) 示例: 输入: 输出: 有关 s_arr(i) 的更多信息(在此示例中): 我的琐碎解决方案: 显然,复杂性是O(N * K)。应该怎么做才能降低这种算法的复杂性?{arr [i], arr [i + 1], ... arr [i + K]}
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(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 + ")")
答案 0 :(得分:1)
您可以使用众所周知的滑动窗口最小算法来实现O(N)复杂度。
答案 1 :(得分:-1)
您应该使用先前阵列中已有的信息。如果前一个数组(i-1)的第一个元素不是较小的,您可以简单地将上次迭代找到的最小值与当前数组的最后一个元素(i + k-1)进行比较。
希望有所帮助。