NC125 无序数组中连续子数组之和等于特定值的最长连续子数组长度
发布时间
阅读量:
阅读量
描述
已知一个未排序的数组arr,其内部元素可以为正数、负数或零。设定一个整数值k,要求找出所有连续子数组中,累加和等于k的最长子数组的长度。
题目条件确保至少存在一个满足要求的子数组。
小标题
复制返回值信息:
假设s(i)表示子数组arr[0…i]的累加和,那么s(j)则代表子数组arr[0…j]的累加和,由此可计算出arr[j+1…i]的值为s(i)-s(j)。
流程:
- 初始化变量sum=0,用于表示从arr[0]依次累加至arr[i]的总和。同时初始化变量len,用于记录累加和等于k的最长子数组长度。建立一个map结构,用以存储已出现过的sum值及其首次出现的位置。其中key表示某个特定的sum值,value则对应该sum值第一次出现时的索引位置。
在每一步中将当前元素arr[i]加入到sum中,即得到s(i),然后在map中查找是否存在sum-k这一数值。
2.1 若存在sum-k,则取出其首次出现的位置j,意味着子数组arr[0…j]的总和为sum-k,即等于s(j)。根据之前的设定可知,子数组arr[j+1…i]对应的总和为s(i)-s(j),而由于此时sum=s(i),因此有arr[j+1…i]=sum-(sum-k)=k。因为map中保存的是最早出现的位置信息,所以
全部评论 (0)
还没有任何评论哟~
