这是Maximum_subarray_problem的变体。
在长度为N(0 <= K <= N)
的数组中找到长度最多为K的连续子阵列 EG。给定[-13,-1,1,1,2,3,1,1]
和K = 2
,最大K-subarray总和为5
寻找 O(N)解决方案。平凡的解决方案是O(N * N),检查每对之间的范围。我觉得它可以改进到O(N)。
答案 0 :(得分:2)
让您的数组以1到n编制索引。设 f(i)是以 i 结尾的最大子数组, prefixSum(i)是前缀总和(包括)索引 I 的。然后我们有
f(i)= prefixSum(i) - MIN(j = i - K到i - 1,prefixSum(j))
f(i)可以使用sliding window minimum数据结构以线性时间计算。队列的Here's another implementation,它支持入队,出队和 find-max / min 。使用该队列作为基元,算法在伪代码中看起来像这样:
global_max = -infinity
prefixSum[0] = 0
q = new MinQueue()
for i := 1 to n:
prefixSum[i] = prefixSum[i - 1] + a[i]
if i > 1
q.enqueue(prefixSum[i - 1])
if i - K - 1 >= 1
q.dequeue()
global_max = max(global_max, prefixSum[i] - q.min())
答案 1 :(得分:0)
这是在O(n)
中执行相同任务的Java代码public void maxSubSet (int[] array, int k)
{
int startIndex = -1;
int max = 0;
for(int i =0; i<k; i++){ //Assuming k<array.length
max += array[i];
startIndex = 0;
}
for(int i=k; i<array.length; i++){
int sum = array[i] - array[i-k];
if (sum > max){
max = sum;
startIndex = i;
}
}
System.out.println("Max Sum:" + max);
for(int i = startIndex; i<startIndex+k; i++)
System.out.println(i+":"+array[i]);
}