leetcode 貪心 貪心演算法 最大子序和

2021-10-12 18:29:19 字數 1967 閱讀 4158

通知:我將演算法學習相關的資料已經整理到了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單源最短路徑 貪心選擇性質 所謂貪心選擇性質是指...