当前位置: 首页 > 知识库问答 >
问题:

对于每个k=1..n,大小为k的所有子数组的最大和

宋昕
2023-03-14
array = {7, 1, 3, 1, 4, 5, 1, 3, 6}
n = #array

function maxArray(k)
    ksum = 0
    for i = 1, k do
        ksum = ksum + array[i]
    end
    max_ksum = ksum
    for i = k + 1, n do
        add_index = i
        sub_index = i - k
        ksum = ksum + array[add_index] - array[sub_index]
        max_ksum = math.max(ksum, max_ksum)
    end
    return max_ksum
end

for k = 1, n do
    print(k, maxArray(k))
end

相关主题:

共有1个答案

宋健柏
2023-03-14

一个有效的解是基于这样一个事实:一个大小为k的子数组(或窗口)的和可以在O(1)时间内用前面的大小为k的子数组(或窗口)的和来得到一个大小为k的子数组(或窗口)的和。除了大小为k的第一个子数组之外,对于其他子数组,我们通过移除最后一个窗口的第一个元素并添加当前窗口的最后一个元素来计算和。

下面是相同的实现

int maxSum(int arr[], int n, int k) 
{ 
// k must be greater 
if (n < k) 
{ 
   cout << "Invalid"; 
   return -1; 
} 

// Compute sum of first window of size k 
int res = 0; 
for (int i=0; i<k; i++) 
   res += arr[i]; 

// Compute sums of remaining windows by 
// removing first element of previous 
// window and adding last element of  
// current window. 
int curr_sum = res; 
for (int i=k; i<n; i++) 
{ 
   curr_sum += arr[i] - arr[i-k]; 
   res = max(res, curr_sum); 
} 

return res; 
 } 

时间复杂度:O(n)辅助空间:O(1)

 类似资料:
  • 我需要找到总和大于或等于< code>k的最小子阵列长度。数组将只有正数。 例如 输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]输出:2说明:子数组[4,3]在问题约束下长度最小。 在我的代码中,对于输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]我得到的答案是< code>3,但正确答案是< cod

  • 子数组包含正数和负数。你必须找到一个最大和子数组,使子数组的长度大于或等于k。 下面是我用C++编写的使用Kadane算法的代码。 我的代码工作得很好,但很慢,我想不出任何方法来改进我的代码。我也读过这个问题,找到最长的子数组,它的和可以被K整除,但这不是我想要的,长度也可以大于K。

  • 问题内容: 我有一组值,并想创建包含2个元素的所有子集的列表。 例如,源集具有以下2个元素的子集: 有没有办法在python中做到这一点? 问题答案: 好像你想要的: 如果要设置,则必须显式转换它们。如果您不介意使用迭代器而不是列表,并且使用的是Python 3,则可以使用: 要一次查看所有结果,可以将的输出传递给。(在Python 2中,的输出自动为列表。) 但是,如果您知道需要列表,则列表理解

  • 有这么多参考文献来寻找大小为k的所有子阵列的最小值/最大值,但是如何以最好的可能方式找到第n个最大值/最小值。如果我们必须找到子阵列的最小值/最大值,那么我们可以使用具有线性时间复杂度的deque解决方案。但是对于第n分钟/最长时间,我无法找到解决方案。 注意:n 例如:arr = {7,1,4,20,11,17,15} n=2,k=4 输出:4,4,11,15

  • 假设您给出了一个大小为N的数组,它可以有正数和负数。我们需要返回总和的最大子数组的长度等于k。我尝试使用滑动窗口算法,但很快我发现它在这里不起作用,因为数组元素可以有正负整数。 例如: arr=[-20,-38,-4,-7,10,4]和k = 3很明显,有两个可能的子阵列([-4,-7,10,4]和[-7,10]),它们的和等于给定的k。因此输出将是4(最大子阵列的长度) 蛮力方法将采取O(n^2

  • 假设我有一个包含整数的数组。 如何找到大小的子集,使得子集中所有整数对之间的距离,我的意思是它们在最远的距离。 示例:数组和, ,最小距离为10和6之间的<错误的子集: ,最小距离为 ,最小距离为 我想到了一个解决办法: 1) 排序数组2)选择一个[0],现在在数组中查找ceil(a[0])=Y。。。。然后ceil(Y