首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Maximum_Subarray_Problem的变异

Maximum_Subarray_Problem的变异
EN

Stack Overflow用户
提问于 2014-04-27 15:34:25
回答 2查看 360关注 0票数 2

这是问题的一个变体。

在长度为N(0 <= K <= N)的数组中,找出长度最多为K的连续子阵

Eg.给定[-13,-1,1,1,2,3,1,1],和,K = 2**,最大K-子阵和为5**

寻找O(N)解决方案。平凡解是O(N*N),检查每对之间的范围。我觉得它可以改进为O(N)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-27 16:53:44

让数组用1到n进行索引。让f( i )是以i结尾的最大子数组,prefixSum(i)是(并包括)索引i的前缀。

f(i) = prefixSum(i) - MIN(j =i to I-1,prefixSum(j))

f(i)可以用滑动窗最小数据结构在线性时间内计算。这是另一个实现的队列,它支持队列,脱队列和查找-max/min.使用该队列作为原语,该算法在伪代码中如下所示:

代码语言:javascript
复制
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())
票数 2
EN

Stack Overflow用户

发布于 2015-12-01 04:35:53

这是在O(n)中执行相同任务的Java代码

代码语言:javascript
复制
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]);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23325281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档