題目描述
輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為 o(n).
⭐思路:
最大子陣列的和一定是由當前元素和之前最大連續子陣列的和疊加在一起形成的,因此需要遍歷n個元素,看看當前元素和其之前的最大連續子陣列的和能夠創造新的最大值。
根據**可以畫出乙個**用來記錄遞迴行為,可以更好的理解動態規劃的細節,array[i]為測試用例:
max用來記錄最大值,newmax用來記錄區域性的最大值吧,dp[i]維護array前 i 個數的相加
i=1、2時,因為0、1加起來時負值,newmax當前最大值相當於012相加,結果肯定比比array[i]小,dp[i]就去記錄array[i],相當於吧0、1給「甩掉」。
i=4的時候,雖然也是負值,newmax還是大於array[i]的,dp還是把當前值記錄下來,除非這個newmax這個記錄前 i 次記錄和的值,比array[i]當前值小,否則一直「保留」。
public class solution
else
if(dp[i] > max)
}
return max;
}}
繼續優化一下:
dp[n]代表以當前元素為截止點的連續子串行的最大和,如果dp[n-1]>0,dp[n]=dp[n]+dp[n-1],因為當前數字加上乙個正數一定會變大;如果dp[n-1]<0,dp[n]不變,因為當前數字加上乙個負數一定會變小。使用乙個變數max記錄最大的dp值返回即可。
public int findgreatestsumofsubarray(int array)
return max;
}
寫在最後
距離上次更新部落格過去了三個月,去年考完試複習的昏天黑地,考完試只想輕鬆一下,回家後正好過節,斷斷續續的看了看jvm和機器學習的演算法,在過節的氣氛裡沒想起來寫部落格,知道開學以後才想起來自己還有個部落格。我在找東西的時候發現,現在的部落格都大差不差,冗餘的東西太多了,很多東西與其說是寫給別人的,不如說是寫給自己的,除了自己別人看了一頭霧水,能學到啥玩意。我寫部落格也是這樣,寫一篇好的部落格需要花時間花精力,排版布局碼字,而我還只是乙個初學者,學習就已經花了我很多精力了,我盡量在學習之餘,盡最大的可能寫出讓自己能理解,別人也能理解的部落格,因為寫部落格不僅僅時為了讓自己理解。
當初寫部落格,想著是對自己學習的一種總結,據「艾賓浩斯遺忘曲線」的理論,學習指望前看不會顧,效率是很低的,所以說溫故而知新,希望我2021的學習之路,能夠再提公升一下自己的學習效率。其實學習本身就是一門學問,磨刀不誤砍柴工。
我看到天天更新的博主,很驚訝他是如何堅持下來的,看到更著更著突然不更的博主,又挺好奇他跑到**去了,是不是賬號忘了
劍指offer 連續子陣列最大和
題目 對於乙個有正有負的整數陣列,請找出總和最大的連續數列。給定乙個int陣列a和陣列大小n,請返回最大的連續數列的和。1.思路 1 定義兩個變數,乙個儲存最終的最大和,乙個是臨時變數,不能初始化為0,初始化都為陣列第乙個數 防止都是負數,它的和肯定是負數 2 for迴圈依次向後遍歷,如果tmp臨時...
劍指offer 連續子陣列最大和
hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...
《劍指offer》連續子陣列的最大和
hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...