演算法 求陣列中累加和為定值的最長子陣列

2021-10-04 18:17:16 字數 1765 閱讀 9159

o(n*n)的演算法,我想大家都應該很瞭如指掌,那我們就講一種o(n)的演算法,借助map巧妙地解決。(主要在思想上,**其實很簡潔)

後面有類似思想拓展題。

【演算法思想】

我們準備乙個map來完成記錄操作。 map的意義是從開始累加到i位置的和為sum的時候,此時陣列的下標i。且sum必須是新出現的。

初始的時候,map[0] = -1。 不能存0,因為沒有元素的時候累加和就是0。(看例子好理解)

比如陣列arr為 【7 ,3,2,1,1,7,-6,-1,7】 aim = 7

初始的時候sum = 0 map}

下標為0時,sum+=arr[1] , sum = 7 ,此時找sum-aim = 0的值出現在什麼位置,map此時},是-1位置,所以-1的下乙個位置到這個位置的累加和一定是7, 所以【0,0】區間上肯定累加和是7。此時要把這條記錄 增加到map中,表示累加到0位置,累加和為7。

下標為1時,sum += arr[1] , sum = 10,此時找sum - aim = 3出現在什麼位置,發現map中沒有累加和為3的。所以以arr[1]結尾的,不可能累加出aim的陣列。 並將 ()這條記錄增加到map中

下標為2時,sum += arr[2} , sum = 12, 此時找sum-aim = 5出現在什麼位置,發現map中沒有累加和為5的。所以以arr[2]結尾的,不可能累加出aim的陣列。並將 這條資料加到map中

下標為3時,sum += arr[3], sum = 13,此時找sum - aim = 6 出現在什麼位置,發現map中沒有累加和為6的。所以以arr[3]結尾的,不可能累加出aim的陣列。並將這條資料加到map中

下標為4時,sum += arr[4], sum = 14, 此時找sum - aim = 7 出現在什麼位置,發現map中有 這條資料,所以從0的下乙個位置到4,也就是【1,4】能累加出7,記錄一下長度。但是此時sum=14也是新出現的數字,將 加這條資料入進map當中

下標為5時,sum += arr[5], sum = 21, 此時找sum - aim = 14 出現在什麼位置,發現map中有 ,所以從4的下乙個位置也就是【5,5】來說肯定能累加出aim。此時sum = 21是新出現的, 將 加入到map中

下標為6時,。。。

下標為7時,。。。

下標為8時 ,。。。

**實現:

int

maxlength

(vector<

int>

& arr,

int aim)

map<

int,

int> mymap;

mymap[0]

=-1;

int len =0;

int sum =0;

for(

int i =

0; i < arr.

size()

; i++)if

(mymap.

find

(sum)

== mymap.

end())

}return len;

}

拓展題1:一堆數有奇數有偶數,求奇數和偶數個數相等的最長子陣列?

演算法思想:奇數變為-1,偶數變為1,求最大累加和為0的最長子陣列

拓展題2:乙個陣列中有0,1,2,求1和2出現次數相等的最長子陣列是多少?

演算法思想::類似。

演算法 和為定值

輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。咱們試著一步一步解決這個問題 注意闡述中數列有序無序的區別...

累加和為aim的最長子陣列

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

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

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