这是问题的一个变体。
在长度为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)。
发布于 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.使用该队列作为原语,该算法在伪代码中如下所示:
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())发布于 2015-12-01 04:35:53
这是在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]);
}https://stackoverflow.com/questions/23325281
复制相似问题