Algorithm 修改的相邻子阵列的和
给定一个大小为N的一维数组a,该数组可能同时包含正整数和负整数以及整数K,求具有最大和的连续数字子数组的和,以使所选数组中的任何元素都不大于K。当我们提供Q查询时,该K会发生变化,每个查询都包含一个整数,即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可以线性求解。 以下是步骤:Algorithm 修改的相邻子阵列的和,algorithm,Algorithm,给定一个大小为N的一维数组a,该数组可能同时包含正整数和负整数以及整数K,求具有最大和的连续数字子数组的和,以使所选数组中的任何元素都不大于K。当我们提供Q查询时,该K会发生变化,每个查询都包含一个整数,即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,则选择的子
sum=0
和maximum\u sum=0
--如果当前索引值小于或等于
K
,则将当前值添加到总和中。如果大于此值,则将总和设为0
--如果当前总和大于最大总和
,则更新最大总和
I
结尾的子数组和,其中array[I]>K
,可以认为是零(如证明其充分必要):
但是K随每个查询的查询而变化O(N)是不可承受的
def max_subarray(A):
max_ending_here = max_so_far = 0
for x in A:
if x > K:
max_ending_here = 0
else:
max_ending_here = max(0, max_ending_here + x)
max_so_far = max(max_so_far, max_ending_here)
return max_so_far