修改了连续子阵列的总和

时间:2015-03-28 16:40:14

标签: algorithm

给定大小为N的一维数组A,其可以包含正整数和负整数以及整数K,找到具有最大总和的数字的连续子数组的总和,使得所选数组中的元素不大于K这个K改变了,因为我们提供的Q查询每个包含一个整数,即K。

示例:设N = 5且Q = 6,数组为[1 2 3 4 5],查询为:

查询1:K = 5然后选择的子阵列是[1,2,3,4,5]。元素之和= 15。

查询2:K = 4,然后选择的子阵列为[1,2,3,4]。要素总和= 10。

查询3:K = 3,然后选择的子阵列为[1,2,3]。元素之和= 6。

查询4:k = 2然后选择的子阵列是[1,2]。元素之和= 3。

查询5:k = 1然后选择的子阵列为[1]。元素之和= 1。

查询6:k = 0因为数组A中没有元素X使得X <= 0.因此,答案是&#34;没有解决方案&#34;。

如何有效地回答这些问题?请帮助1≤N,Q≤5* 10 ^ 5和-10 ^9≤Ai,K≤10^ 9

2 个答案:

答案 0 :(得分:1)

你可以线性解决它。 以下是步骤:

  1. 初始化sum=0maximum_sum=0
  2. 循环索引1到n
    - 如果当前索引值小于或等于K,则将当前值添加到sum。如果更大,则生成sum=0
    - 如果当前金额大于maximum_sum,请更新maximum_sum
  3. print maximum_sum
  4. 复杂性 O(n)

答案 1 :(得分:1)

熟悉Kadane's algorithm。在计算最大子阵列总和时,有必要不考虑包含大于K的元素的子阵列。因此,在算法的实现中(以维基百科的Python代码为例),对于以索引{{结尾的子阵列总和1}},其中I可以被认为是零(例如,证明它是充分和必要的):

array[I] > K