给定大小为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
答案 0 :(得分:1)
你可以线性解决它。 以下是步骤:
sum=0
和maximum_sum=0
K
,则将当前值添加到sum
。如果更大,则生成sum=0
maximum_sum
,请更新maximum_sum
复杂性: O(n)
答案 1 :(得分:1)
熟悉Kadane's algorithm。在计算最大子阵列总和时,有必要不考虑包含大于K的元素的子阵列。因此,在算法的实现中(以维基百科的Python代码为例),对于以索引{{结尾的子阵列总和1}},其中I
可以被认为是零(例如,证明它是充分和必要的):
array[I] > K