劍指offer第二版-42.連續(xù)子數(shù)組的最大和(動態(tài)規(guī)劃)

本系列導航:劍指offer(第二版)java實現(xiàn)導航帖](http://www.itdecent.cn/p/010410a4d419)

面試題42:連續(xù)子數(shù)組的最大和

題目要求:
輸入一個整形數(shù)組,數(shù)組里有正數(shù)也有負數(shù)。數(shù)組中一個或連續(xù)多個整數(shù)組成一個子數(shù)組。求所有子數(shù)組的和的最大值,要求時間復雜度為o(n)。

解題思路:
暴力求解,簡單直接,但時間復雜度o(n^2)。
其實這種最值問題,很容易讓人想到動態(tài)規(guī)劃。對于數(shù)據(jù)data[],申請一個數(shù)組dp[],定義dp[i]表示以data[i]為末尾元素的子數(shù)組和的最大值。dp的初始化及遞推公式可表示為

dp[i] =  data[i]            i=0或dp[i-1]<=0
         dp[i-1]+data[i]    i!=0且dp[i-1]>0

由于dp[i]僅與dp的前一個狀態(tài)有關,即在計算dp[i]時,dp[i-2],dp[i-3]......,dp[0]對于dp[i]沒有影響,因此可以省去dp數(shù)組,用一個變量記錄當前dp值,用另一個變量maxdp記錄出現(xiàn)的最大的dp值。如此處理后,時間復雜度為o(n),空間復雜度為o(1)。

package chapter5;

/**
 * Created with IntelliJ IDEA.
 * Author: ryder
 * Date  : 2017/8/1
 * Time  : 20:58
 * Description:連續(xù)子數(shù)組的最大和
 **/
public class P218_GreatestSumOfSubarrays {
    //動態(tài)規(guī)劃,遞歸公式:dp[i] =  data[i]          i=0或dp[i-1]<=0
    //                           dp[i-1]+data[i]  i!=0且dp[i-1]>0
    //由于只需知道前一個情況的dp值,因此可省去dp數(shù)組,申請個變量記錄即可
    public static int findGreatestSumOfSumArrays(int[] data){
        if(data==null || data.length==0)
            return 0;
        //dp[i]用于計算以data[i]為結尾元素的連續(xù)數(shù)組的最大和
        //maxdp用于記錄在上述過程中的最大的dp值
        int dp = data[0],maxdp = dp;
        for(int i=1;i<data.length;i++){
            if(dp>0)
                dp += data[i];
            else
                dp = data[i];
            if(dp>maxdp)
                maxdp = dp;
        }
        return maxdp;
    }
    public static void main(String[] args){
        int[] data = {1,-2,3,10,-4,7,2,-5};
        System.out.println(findGreatestSumOfSumArrays(data));
    }
}

運行結果

18
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,927評論 0 33
  • 動態(tài)規(guī)劃(Dynamic Programming) 本文包括: 動態(tài)規(guī)劃定義 狀態(tài)轉移方程 動態(tài)規(guī)劃算法步驟 最長...
    廖少少閱讀 3,659評論 0 18
  • 分治方法 將問題劃分成互不相交的子問題 遞歸地求解子問題 將子問題的解組合起來 動態(tài)規(guī)劃(兩個要素:最優(yōu)子結構、子...
    superlj666閱讀 590評論 0 0
  • 《ijs》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 5,651評論 0 7
  • 一個星期以前,宋意的微信好友里面多了一個人,對方是朋友介紹的“朋友”,她抱著試一試的心態(tài)同意了他的好友請求,然后還...
    愛吃巧克力的泡芙閱讀 462評論 0 1

友情鏈接更多精彩內容