【发布时间】: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)
输出:所有对(offset,min(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