題目:給定乙個陣列,要求其連續子陣列的最大和。如陣列為,連續子陣列的最大和為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 的最大值與...