陣列連續子陣列最大和最大乘積

2021-06-16 21:18:53 字數 1257 閱讀 5845

題目:給定乙個陣列,要求其連續子陣列的最大和。如陣列為,連續子陣列的最大和為8(從第0個開始,到第3個為止)

解法1:首先最容易想到的便是利用列舉的方法,列舉出所有可能大小的連續子陣列的和,然後選出其中最大的乙個。即從連續子陣列的大小為1一直到n,分別計算它們的和,最後選出使和最大的那個子陣列。這種方法的實現比較簡單,只需要三重迴圈即可。然而這種實現方法的複雜度是o(n^3),對於稍微大點的n,執行時間是不可接受的。由於實現方式比較簡單,故此沒有給出**。

解法2:很容易理解,當我們加上乙個正數時,和會增加;當我們加上乙個負數時,和會減少。如果當前得到的和是個負數,那麼這個和在接下來的累加中應該拋棄並重新清零,不然的話這個負數將會減少接下來的和。基於這樣的思路,我們可以寫出如下**。

long getmaxsum(int *arr, int n, int &max_l, int &max_h)

if(sum <= 0)

}return max_sum;

}

變形題目:這個題目有乙個變形。陣列是首尾相連的,即相當於陣列是乙個環的結構,要求從這個環的結構中求出最大的和。

解法:當陣列是首尾相連時,求連續子陣列最大和的方法可以歸納如下:

1.將原陣列進行擴充,即假設原陣列為,則擴充相當於

2.利用上述的解法在擴充後的陣列進行遍歷求其連續子陣列的最大和,不過要做一些小改動,即保證子陣列的長度在原陣列的長度範圍之內。這樣求出來的結果即是原陣列首尾相連後,連續子陣列的最大和。

**:

/**

*首尾相連連續子陣列的最大和

*@param max_l:最終子陣列的起始索引

*@param max_h:最終子陣列的終止索引

*@return :返回最大的子陣列的和

*/long getmaxsum(int *arr, int n, int &max_l, int &max_h)

if(sum > max_sum)

if(sum <= 0)

}return max_sum;

}

題目:給定乙個長度為n的陣列,其中元素有正有負,求該陣列的連續子陣列的最大乘積。

解法:本題的解法分析可以參見july的博文:

最大乘積子陣列

程式設計之美 上有一道關於在長度為n的陣列中找到n 1個元素乘積最大的題目,不過這並不是本文要討論的。本文討論的是另一種情況,給定乙個長度為n的浮點陣列,找乙個長度任意的子陣列 子陣列的元素在原陣列中是連續存放的 這個子陣列的乘積最大。通常,找乙個滿足指定條件子陣列都會使用動態規劃。遞迴縮小問題規模...

子陣列最大乘積

給定乙個double型別的陣列arr,其中的元素可正可負可0,返回子陣列累乘的最大乘積。例如arr 2.5,4,0,3,0.5,8,1 子陣列 3,0.5,8 累乘可以獲得最大的乘積12,所以返回12。解析 此題可以運用動態規劃解決 設f i 表示以i為結尾的最大值,g i 表示以i結尾的最小值,那...

子陣列最大乘積

給定乙個double型別的陣列arr,其中的元素可正可負可0,返回子陣列累乘的最大乘積。例如arr 2.5,4,0,3,0.5,8,1 子陣列 3,0.5,8 累乘可以獲得最大的乘積12,所以返回12。分析 設f i 表示以i為結尾的最大值,g i 表示以i結尾的最小值,那麼 f i 1 的最大值與...