子陣列累加和為aim(小於等於aim)的三個問題
累加和等於aim的最長子陣列的長度(陣列可+,-,0)
這道題我另有文章講解了,這裡就不多說了
累加和等於aim的最長子陣列的長度(陣列只有正數)
這個和上面唯一的不同就是陣列中只有正數,這裡使用類似視窗移動的做法,給出兩個指標,l,r表示視窗的左右邊界 ,sum表示的是arr[l,r]之間的累加和,l,r一直往右動。
累加和小於等於aim的最長子陣列的長度(陣列可+,-,0)public
static
intgetmax
(int
arr,
int aim)
else
if(sum < aim)
else
}return res;
}
兩個陣列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...