问题描述
我被困在问题的结束函数部分和 arr[start]/arr[end] 以及我无法理解代码。问题如下:
给定一个大小为 N 且仅包含非负数的未排序数组 A 整数,找到一个连续的子数组,它与给定的数字 S 相加。
您不需要读取输入或打印任何内容。任务是 完成以 arr、N 和 S 作为输入的函数 subarraySum() 参数并返回一个包含开始和结束的列表 左边第一个这样出现的子数组的位置,其中 sum 等于S。列表中的两个索引应根据 基于 1 的索引。如果没有找到这样的子数组,则返回-1。
def subArraySum(arr,n,sum):
curr_sum = 0
start = 0
end=0
i = 0
while end <= n-1:
if curr_sum<sum:
curr_sum=curr_sum+arr[end]
end=end+1
while curr_sum>sum:
curr_sum=curr_sum-arr[start]
start=start+1
if curr_sum==sum:
break
if curr_sum != sum:
return[-1]
else:
return start+1,end
解决方法
此代码正在寻找加起来等于给定数字的最早连续序列。例如:
1 1 2 4 5 2
是 6 个数字的序列。如果我们正在寻找第一个与 7 相加的序列,我们最终会在由两个索引 start
和 end
定义的子序列中得到 1、2 和 4:
start|
1 1 2 4 5 2
end|
请注意,end
是最后一个。这是一个常见的约定。同样在任何给定时间,curr_sum
是子序列中所有数字的总和。在上述情况下,7.
代码以 start
和 end
为 0 开始。随着代码循环,如果当前子序列的总和 curr_sum
小于所需的总和,则使通过将 end
向上移动一个,从前端开始更长的子序列。如果 curr_sum
太大,它会根据需要向上移动 start
多次来缩短子序列。如果 curr_sum
是正确的总和,则它跳出函数并返回 start
和 end
索引。
综上所述,您可以通过不同的方式在此处跟踪索引。尽我所能,子序列由从 start
到但不包括 end
的基于 0 的索引定义。然后在最后,它返回包含结束索引的基于 1 的索引,这就是它使用 start+1,end
而不是 start,end
的原因。