未排序正整數組中累加和為指定值的最長子陣列長度

2021-09-25 05:28:51 字數 1116 閱讀 5770

題目:給定乙個陣列arr,該陣列無序,但每個值都為正數,在給定乙個正數k。求arr中所有的子陣列中所有元素累加為k的最長子陣列長度。 

例如,arr = [1,2,1,1,1],k = 3. 

累加和為3的最長子陣列為[1,1,1],所以返回結果為3。

基本思路:

使用兩個指標left和right,代表子陣列的範圍,初始時都為 0。使用變數sum記錄子陣列的累加和,初始為arr[0]。即arr[0…0]的累加和。根據sum與k的比較結果確定指標的移動:

1、如果 sum == k,說明目前子陣列的累加和滿足條件,該子陣列的長度可知 right - left + 1。因為整個陣列元素都是正數,所以,在擴充套件該子陣列顯然不可能等於k,所以我們應該令left加1,開始考察以 left + 1 位置開始的子陣列,同時令 sum -= arr[left].

2、如果 sum < k,說明還需要加上 right 後面的元素,所以令right + 1,同時令 sum += arr[right+1]。這裡需要注意 right + 1 後是否越界。 

3、如果 sum > k,說明此時子陣列的累計和已經大於k,所以令left + 1 表示開始考慮以 left + 1 開始的子陣列,同時令 sum -= arr[left].

def getmaxlength(l,k):

if l == none or len(l)<1 or k < 0:

return 0

left = 0

right = 0

sum_ = l[0]

length = len(l)

while right < len(l):

if sum_ == k:

length = max(length,right-left+1)

sum_ -= l[left]

left +=1

elif sum_ < k:

right = right +1

if right == len(l):

break

sum_ += l[right]

else:

sum_ -= l[left]

left +=1

return length

未排序陣列中累加和為給定值的最長子陣列系列問題

牛客網左程雲第二課第三題,這是乙個很重要的演算法原型。問題 給定乙個無序陣列 arr,其中元素可正 可負 可 0,給定乙個整數 k。求 arr 所有的子陣列中累加和為 k 的最長子陣列長度。要求 時間複雜度 o n 分析 本題和未排序正數陣列中累加和為給定值的最長子陣列長度這個問題的區別在於,陣列中...

未排序陣列中累加和為給定值的最長子陣列系列問題

題目 給定乙個無序陣列arr,其中元素可正 可負 可0,給定乙個整數k。求arr中所有的子陣列中累加和為k的最長子陣列長度。補充題目 給定乙個無序陣列arr,其中元素可正 可負 可0,給定乙個整數k。求arr中所有的子陣列中正數與負數個數相等的最長子陣列長度。補充題目 給定乙個無序陣列arr,其中元...

未排序正數陣列中累加和為給定值的最長子陣列的長度

未排序正數陣列中累加和為給定值的最長子陣列的長度 給定乙個陣列arr,該陣列無序,但每個值均為正數,再給定乙個正數k。求arr的所有子陣列中所有元素相加和為k的最長子陣列的長度 例如,arr 1,2,1,1,1 k 3 累加和為3的最長子陣列為 1,1,1 所以結果返回3 要求 時間複雜度為o n ...