簡單講解最大連續子陣列問題

2021-09-28 17:56:01 字數 1655 閱讀 9107

題目描述:求出乙個陣列中連續子陣列的和

eg:所以最大連續字陣列的和為(6,-3,-2,7 )為8。

method one:貪心演算法

在使用貪心演算法求解最大子陣列問題之前,我們就要貪心,貪心的可以讓連續的子陣列越來越大,那麼我們應該怎樣貪心呢?

解析:首先我們想要得到陣列中最大的連續子陣列,那我們就得遍歷整個陣列,那麼我們想要在遍歷完陣列後就可以得到最大值,所以我們就得盡可能多的在每乙個元素遍歷時留下最大的資料,從而為下次遇見大資料做好充足的準備。(即機會總是留給做準備的人(資料))

**:

就如上圖我們一直在使用count保留最多的能量,每次讓count + arr[i] 和 arr[i] 相比較然後讓較大的再賦值給count。

實現**:c++

class solution 

else

if (count > max)

}return max;

}};int main()

; vectorbrr(arr,arr+5);

solution s;

cout << s.findgreatestsumofsubarray(brr) << endl;;

system("pause");

return 0;

}

method two:分治演算法首先給大家看一張圖

解析:分治演算法的核心就是把乙個長的陣列分成若干份,分別求出每段的字串的最大值,然後合併計算,比較求出合併後的最大子陣列;

注意:每次合併一定要從兩個合併區間的中間向兩邊進行遍歷。

實現**:c++

class solution 

int mid = (start + end) / 2;

int leftmax = _max(array, start, mid);

int rightmax = _max(array, mid + 1, end);

int leftsize = array[mid];

int left = 0;

int rightsize = array[mid + 1];

int right = 0;

int max = 0;

while (start <= mid)

mid--;

} mid = (start + end) / 2 + 1;

while(mid <= end)

mid++;

} max = leftsize + rightsize;

if (leftmax > max)

if (rightmax > max)

return max;

} int findgreatestsumofsubarray(vectorarray) };

int main()

; vectorbrr(arr,arr+8);

solution s;

cout << s.findgreatestsumofsubarray(brr) << endl;;

system("pause");

return 0;

}

最大連續子陣列

對於乙個給定的陣列a,求 a中連續子陣列,使得該陣列的和最大 例如 a 1,2,3,10,4,7,2,5 結果 3 10 4 7 2 暴力法 遍歷求a的所有子陣列,求和最大的 分治法 陣列的和最大那個陣列只會出現在以下三種情況中 a.存在於陣列下標從0到mid中,其中mid為陣列長度 length ...

最大連續子陣列

問題描述,給定乙個陣列a 0,1,n 1 求出a的連續陣列,使得該子陣列的和最大。例如 陣列a 1,2,3,10,4,7,2 則最大的子陣列為 3,10,4,7,2 解法 1.暴力法 2.分治法 3.動態規劃法 一 暴力發 分析 直接求解a i,j 的值,0 i n i j n,i,i 1,j 1的...

最大連續子陣列

題目 給乙個陣列,返回它的最大連續子串行的和 子向量的長度至少是1 例如 連續子向量的最大和為8 從第0個開始,到第3個為止 使用動態規劃 f i 以array i 為末尾元素的子陣列的和的最大值,子陣列的元素的相對位置不變 f i max f i 1 array i array i res 所有子...