通知:我將演算法學習相關的資料已經整理到了github :裡面還有leetcode刷題攻略、各個型別經典題目刷題順序、思維導圖看一看一定會有所收穫,如果給你有幫助給乙個star支援一下!給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
示例:輸入: [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
暴力解法的思路,第一層for 就是設定起始位置,第二層for迴圈遍歷陣列尋找最大值
時間複雜度:o(n^2) 空間複雜度:o(1)
class solution } return result; }};
以上暴力的解法c++勉強可以過,其他語言就不確定了。
「貪心貪的是**呢?」
如果 -2 1 在一起,計算起點的時候,一定是從1開始計算,因為負數只會拉低總和,這就是貪心貪的地方!
全域性最優:選取最大「連續和」
「區域性最優的情況下,並記錄最大的「連續和」,可以推出全域性最優」。
從**角度上來講:遍歷nums,從頭開始用count累積,如果count一旦加上nums[i]變為負數,那麼就應該從nums[i+1]開始從0累積count了,因為已經變為負數的count,只會拖累總和。
「這相當於是暴力解法中的不斷調整最大子序和區間的起始位置」。
「那有同學問了,區間終止位置不用調整麼? 如何才能得到最大「連續和」呢?」
區間的終止位置,其實就是如果count取到最大值了,及時記錄下來了。例如如下**:
if (count > result) result = count;
「這樣相當於是用result記錄最大子序和區間和(變相的算是調整了終止位置)」。
如動畫所示:
紅色的起始位置就是貪心每次取count為正數的時候,開始乙個區間的統計。
那麼不難寫出如下c++**(關鍵地方已經注釋)
class solution if (count <= 0) count = 0; // 相當於重置最大子序起始位置,因為遇到負數一定是拉低總和 } return result; }};
時間複雜度:o(n)
空間複雜度:o(1)
當然題目沒有說如果陣列為空,應該返回什麼,所以陣列為空的話返回啥都可以了。
當然本題還可以用動態規劃來做,當前「**隨想錄」主要講解貪心系列,後續到動態規劃系列的時候會詳細講解本題的dp方法。
那麼先給出我的dp**如下,有時間的錄友可以提前做一做:
class solution return result; }};
時間複雜度:o(n)
空間複雜度:o(n)
本題的貪心思路其實並不好想,這也進一步驗證了,別看貪心理論很直白,有時候看似是常識,但貪心的題目一點都不簡單!
後續將介紹的貪心題目都挺難的,哈哈,所以貪心很有意思,別小看貪心!
就醬,如果感覺「**隨想錄」乾貨滿滿,就幫忙分享一波吧,讓更多的小夥伴知道這裡!
我是程式設計師carl,個人主頁:
這裡每天8:35準時推送一道經典演算法題目,我選擇的每道題目都不是孤立的,而是由淺入深,環環相扣,幫你梳理演算法知識脈絡,輕鬆學演算法!
@**隨想錄期待你的關注
貪心演算法(leetcode)
1 分糖果 455 用最小的糖果大小滿足需求最小的孩子 class solution else return count 2 搖擺序列 376 遍歷一次,儲存乙個狀態,如果狀態為上公升,變為下降,則長度 1,下降變上公升 1 class solution def wigglemaxlength se...
LeetCode 貪心演算法
12.15 135.12.21 435.假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多只能給一塊餅乾。對每個孩子 i,都有乙個胃口值 g i 這是能讓孩子們滿足胃口的餅乾的最小尺寸 並且每塊餅乾 j,都有乙個尺寸 s j 如果 s j g i 我們可以將這個餅乾 j 分配給孩...
leetcode 貪心演算法
貪心演算法中,是以自頂向下的方式使用最優子結構,貪心演算法會先做選擇,在當時看起來是最優的選擇,然後再求解乙個結果的子問題。貪心演算法是使所做的選擇看起來都是當前最佳的,期望通過所做的區域性最優選擇來產生乙個全域性最優解 如最小生成樹 dijkstra單源最短路徑 貪心選擇性質 所謂貪心選擇性質是指...