貪心 02 貪心演算法題目解析

2022-06-17 14:42:15 字數 2647 閱讀 5665

122. 買賣**的最佳時機 ii

134. 加油站

給定乙個陣列,它的第 i 個元素是一支給定**第 i 天的**。設計乙個演算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易(多次買賣一支**)。

注意:你不能同時參與多筆交易(你必須在再次購買前**掉之前的**)

示例 1:

輸入: [7,1,5,3,6,4]

輸出: 7

解釋: 在第 2 天(**** = 1)的時候**,在第 3 天(**** = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。 隨後,在第 4 天(**** = 3)的時候**,在第 5 天(**** = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。

示例 2:

輸入: [1,2,3,4,5]

輸出: 4

解釋: 在第 1 天(**** = 1)的時候**,在第 5 天 (**** = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接連購買**,之後再將它們賣出。因為這樣屬於同時參與了多筆交易,你必須在再次購買前**掉之前的**。

示例 3:

輸入: [7,6,4,3,1]

輸出: 0

只需要計算增加的部分即可

在一條環路上有 n 個加油站,其中第 i 個加油站有汽油 gas[i] 公升。你有一輛油箱容量無限的的汽車,從第 i 個加油站開往第 i+1 個加油站需要消耗汽油 cost[i] 公升。你從其中的乙個加油站出發,開始時油箱為空。如果你可以繞環路行駛一周,則返回出發時加油站的編號,否則返回 -1。

說明: 如果題目有解,該答案即為唯一答案。輸入陣列均為非空陣列,且長度相同。輸入陣列中的元素均為非負數。

示例 1:

輸入:

gas = [1,2,3,4,5]

cost = [3,4,5,1,2]

輸出: 3

解釋:從 3 號加油站(索引為 3 處)出發,可獲得 4 公升汽油。此時油箱有 = 0 + 4 = 4 公升汽油

開往 4 號加油站,此時油箱有 4 - 1 + 5 = 8 公升汽油

開往 0 號加油站,此時油箱有 8 - 2 + 1 = 7 公升汽油

開往 1 號加油站,此時油箱有 7 - 3 + 2 = 6 公升汽油

開往 2 號加油站,此時油箱有 6 - 4 + 3 = 5 公升汽油

開往 3 號加油站,你需要消耗 5 公升汽油,正好足夠你返回到 3 號加油站。

因此,3 可為起始索引。

示例 2:

輸入:

gas = [2,3,4]

cost = [3,4,3]

輸出: -1

解釋:你不能從 0 號或 1 號加油站出發,因為沒有足夠的汽油可以讓你行駛到下乙個加油站。

我們從 2 號加油站出發,可以獲得 4 公升汽油。 此時油箱有 = 0 + 4 = 4 公升汽油

開往 0 號加油站,此時油箱有 4 - 3 + 2 = 3 公升汽油

開往 1 號加油站,此時油箱有 3 - 3 + 3 = 3 公升汽油

你無法返回 2 號加油站,因為返程需要消耗 4 公升汽油,但是你的油箱只有 3 公升汽油。

因此,無論怎樣,你都不可能繞環路行駛一周。

sum(gas) >= sum(cost),則必定存在解(貪心策略不用嚴格證明,大家以汽油累計量為

0,每站汽油累計量可正可負,極限條件畫個環形圖理解下:大致就是左邊累積量少,我就往右邊走,反之亦然)

我們只需找到以

i開頭的總累計油量有剩餘

cur_tank + gas[i] - cost[i] >= 0

即可——

這就是本題貪心策略的依據

classsolution:

defcancompletecircuit(self, gas: list[int], cost: list[int]) -> int:

total_tank ,cur_tank = 0,0

n = len(gas)

index = 0

fori inrange(n):

total_tank  += gas[i] - cost[i]

cur_tank +=  gas[i] - cost[i]

ifcur_tank 

若當前小於

0  則另起爐灶

index = i + 1

cur_tank = 0

returnindex  iftotal_tank >=0else-1#

根據總的剩餘

gas比較來判斷輸出

【1】

經典貪心演算法 貪心演算法概述

貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...

貪心演算法(1) 雙指標貪心演算法

leetcode例題 給定乙個字串 s 和乙個字元模式 p 實現乙個支援 和 的萬用字元匹配。可以匹配任何單個字元。可以匹配任意字串 包括空字串 兩個字串完全匹配才算匹配成功。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例 1 輸...

總結 貪心演算法 貪心演算法入門總結

英語 greedy algorithm,又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優 即最有利 的選擇,從而希望導致結果是最好或最優的演算法。比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心演算法。貪心演算法在有最優子結構的問題中尤為有效。最優子結構的意思...