參考:
擴充套件1乙個陣列中要麼是奇數,要麼是偶數,求奇數和偶數相等的最長子陣列。
思路用1表示奇數,用-1表示偶數,那麼就是求累加和為0的最長子陣列,參考上面
擴充套件2求乙個陣列怎樣劃分可以使得子陣列異或為0的個數最多。
思路動態規劃:
定義乙個dp陣列,dp[ i ]表示以 i 結尾可以劃分的最多個數
對於第i個數的怎麼求出呢:
1.當i-1最後子數異或和不為0時,dp[i] = dp[i-1]
2.當i-1為最後異或和時,dp[i] = dp[k-1]+1, k為上次距離i-1最近的一組異或和的
異或和用map來儲存,遍歷到乙個數,異或它,求異或後的數在map中最近的索引位置,因為0異或這個數還是這個數。
public
intmosteor
(int
arr)
int eor =0;
int[
] dp =
newint
[arr.length]
; map map =
new hashmap<
>()
; map.
put(0,
-1);
dp[0]
= arr[0]
==0?1
:0; map.
put(dp[0]
,0);
for(
int i =
1; i < arr.length; i++
) dp[i]
= math.
max(dp[i]
, dp[i-1]
);map.
put(dp[i]
, i);}
return dp[dp.length-1]
;}
和為aim的最長子陣列長度
求在給定的陣列中,子陣列中所有數加起來的和等於固定值 aim 的最長子陣列長度。準備乙個字典,key是從 1 位置到當前位置的累加和,value 是第一次得到這個累加和的位置。預設 1 位置的累加和是0.從頭開始遍歷陣列,每次都計算從 1 位置到當前位置的累加和是多少,並將位置資訊和 累加和存到字典...
子陣列累加和為aim 小於等於aim 的三個問題
子陣列累加和為aim 小於等於aim 的三個問題 累加和等於aim的最長子陣列的長度 陣列可 0 這道題我另有文章講解了,這裡就不多說了 累加和等於aim的最長子陣列的長度 陣列只有正數 這個和上面唯一的不同就是陣列中只有正數,這裡使用類似視窗移動的做法,給出兩個指標,l,r表示視窗的左右邊界 su...
演算法 求陣列中累加和為定值的最長子陣列
o n n 的演算法,我想大家都應該很瞭如指掌,那我們就講一種o n 的演算法,借助map巧妙地解決。主要在思想上,其實很簡潔 後面有類似思想拓展題。演算法思想 我們準備乙個map來完成記錄操作。map的意義是從開始累加到i位置的和為sum的時候,此時陣列的下標i。且sum必須是新出現的。初始的時候...