子陣列累加和為aim 小於等於aim 的三個問題

2021-08-30 17:33:06 字數 1398 閱讀 5653

子陣列累加和為aim(小於等於aim)的三個問題

累加和等於aim的最長子陣列的長度(陣列可+,-,0)

這道題我另有文章講解了,這裡就不多說了

累加和等於aim的最長子陣列的長度(陣列只有正數)

這個和上面唯一的不同就是陣列中只有正數,這裡使用類似視窗移動的做法,給出兩個指標,l,r表示視窗的左右邊界 ,sum表示的是arr[l,r]之間的累加和,l,r一直往右動。

public

static

intgetmax

(int

arr,

int aim)

else

if(sum < aim)

else

}return res;

}

累加和小於等於aim的最長子陣列的長度(陣列可+,-,0)

兩個陣列sum和ends,sum[i]表示的是以arr[i]開頭(必須包含arr[i])的所有子陣列的最小累加和,對應的ends[i]表示的是取得這個最小累加和的右邊界。 一開始先求出sums陣列和ends陣列。

這個題目最精華的是左右邊界不回退,就是說,如果從0位置擴到t區間,t+1區間不能擴了,此時不是回到1位置開始擴,而是捨棄0位置,看能不能由於捨棄0位置把t+1位置加進來:

//目前的累加和 sum -> r

int r =0;

//每一次擴到的右邊界

int res =0;

//答案

for(

int start =

0; start < arr.length; start++

) sum -= r > start ? arr[start]:0

;//如果r>start,下面start要++了,視窗內減去arr[start]

res = math.

max(res,r - start)

;//視窗是start ~ r-1 ,所以是長度為r-start

r = math.

max(r,start +1)

;//有沒有可能擴不出去

}return res;

}

累加和為aim的最長子陣列

參考 擴充套件1乙個陣列中要麼是奇數,要麼是偶數,求奇數和偶數相等的最長子陣列。思路用1表示奇數,用 1表示偶數,那麼就是求累加和為0的最長子陣列,參考上面 擴充套件2求乙個陣列怎樣劃分可以使得子陣列異或為0的個數最多。思路動態規劃 定義乙個dp陣列,dp i 表示以 i 結尾可以劃分的最多個數 對...

求累加和小於等於k的最大子矩陣

來自牛客網左程雲第三課第二題 問題 給定乙個無序矩陣,其中有正,有負,有 0,再給定乙個值 k,求累加和小於等於 k 的最大子矩陣大小,矩陣的大小用其中的元素個數來表示。分析 這個問題也是乙個子矩陣問題,參看求子矩陣的最大和的分析,我們同樣可以將其轉換成子陣列問題。本題的演算法原型是未排序陣列中累加...

未排序陣列中累加和小於或等於給定值的最長子陣列長度

來自牛客網左程雲第二課第四題 問題 給定乙個無序陣列 arr,其中元素可正 可負 可 0,給定乙個整數 k。求 arr 所有的子陣列中累加和小於或等於 k 的最長子陣列長度。例如 arr 3,2,4,0,6 k 2,相加和小於或等於 2 的最長子陣列為 所以結果返回 4。要求 時間複雜度 n log...