卡在这个问题上,无法理解子数组之和的代码

问题描述

我被困在问题的结束函数部分和 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 相加的序列,我们最终会在由两个索引 startend 定义的子序列中得到 1、2 和 4:

start|
  1  1  2  4  5  2
           end|

请注意,end 是最后一个。这是一个常见的约定。同样在任何给定时间,curr_sum 是子序列中所有数字的总和。在上述情况下,7.

代码以 startend 为 0 开始。随着代码循环,如果当前子序列的总和 curr_sum 小于所需的总和,则使通过将 end 向上移动一个,从前端开始更长的子序列。如果 curr_sum 太大,它会根据需要向上移动 start 多次来缩短子序列。如果 curr_sum 是正确的总和,则它跳出函数并返回 startend 索引。

综上所述,您可以通过不同的方式在此处跟踪索引。尽我所能,子序列由从 start 到但不包括 end 的基于 0 的索引定义。然后在最后,它返回包含结束索引的基于 1 的索引,这就是它使用 start+1,end 而不是 start,end 的原因。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...