Maximum_Subarray_Problem的变体

时间:2014-04-27 15:34:25

标签: arrays algorithm

这是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)。

2 个答案:

答案 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]);
}