模擬: 最遠可以抵達的大樓 Furthest Building You Can Reach_Leetcode #142

閱讀時間約 7 分鐘

題目敘述

題目會給我們一個大樓陣列heights,裡面分別記錄每一棟大樓的高度。還有參數bricks代表可用的磚塊數目,和 ladders代表可用的伸縮爬梯數目。


一開始從最左邊的大樓頂樓開始出發。

假如下一棟比現在這棟大樓還矮,或者一樣高,則我們可以直接抵達下一棟。

假如下一棟比現在這棟大樓還高,我們可以選擇用疊磚塊補足高度的差值爬到下一棟,或者消耗一個伸縮爬梯爬到下一棟。


請問,最遠能抵達哪一棟大樓


題目的原文敘述


測試範例

Example 1:

raw-image
Input: heights = [4,2,7,6,9,14,12], bricks = 5, ladders = 1
Output: 4
Explanation: Starting at building 0, you can follow these steps:
- Go to building 1 without using ladders nor bricks since 4 >= 2.
- Go to building 2 using 5 bricks. You must use either bricks or ladders because 2 < 7.
- Go to building 3 without using ladders nor bricks since 7 >= 6.
- Go to building 4 using your only ladder. You must use either bricks or ladders because 6 < 9.
It is impossible to go beyond building 4 because you do not have any more bricks or ladders.

Example 2:

Input: heights = [4,12,2,7,3,18,20,3,19], bricks = 10, ladders = 2
Output: 7

Example 3:

Input: heights = [14,3,19,3], bricks = 17, ladders = 0
Output: 3

約束條件

Constraints:

  • 1 <= heights.length <= 10^5

輸入陣列的長度介於1~十萬之間。

  • 1 <= heights[i] <= 10^6

每棟大樓的高度介於1~一百萬之間。

  • 0 <= bricks <= 10^9

磚塊可用數目介於0~十億之間。

  • 0 <= ladders <= heights.length

伸縮滑梯的數量介於0~輸入陣列heights長度之間。


演算法 Greedy + MinHeap

這題比較之後,可以發現功能比較強的是伸縮滑梯,因為用一次滑梯可以爬任意長度到達下一棟大樓;但是,用磚塊就必須一層一層慢慢疊上去才能爬到下一棟

可以想到一個比較直覺的Greedy策略:

遇到比較高的大樓,先把高度差值記錄下來,並且儲存再minHeap最小堆裡面。
接著,假如梯子還有,就先消耗一個伸縮滑梯,用梯子爬過去。
假如梯子已經沒有了,就把之前看過差值最小那棟的取出來,把梯子拿回來,選擇用疊磚塊的方式爬過去之前看過差值最小那棟,並且扣掉對應的磚塊數量;接著在拿剛剛取回的梯子從現在這一棟爬到下一棟
[這邊是整個演算法比較困難也是精華的一部分,可以在紙筆上跟著程式碼追蹤一遍]

假如最後梯子和磚塊都沒有了,那當下這棟大樓就是能抵達的最遠的那一棟大樓。


程式碼 Greedy + MinHeap

from heapq import heappush, heappop

class Solution:
def furthestBuilding(self, heights: List[int], bricks: int, ladders: int) -> int:

# min heap to store building gaps
building_gap_heap = []

total_buildings = len(heights)

# scan each building pair's gap
for i in range( total_buildings-1 ):

cur_building_gap = heights[i+1] - heights[i]


if cur_building_gap > 0:

# next building is higher than current one, add to min heap

heappush(building_gap_heap, cur_building_gap)


if len(building_gap_heap) > ladders:

# the number of positive gaps is more than the number of ladders
# use bricks to fill those smaller gaps

gap_to_climb = heappop(building_gap_heap)
bricks -= gap_to_climb


if bricks < 0:

# we can not fill more gaps, because the bricks is run out
return i

# we can reach last building
return total_buildings-1

複雜度分析 Greedy + MinHeap

時間複雜度:

minHeap最大大小和梯子數量一樣多,每次動態調整需要O(log L)。

最多n回合,總共所需時間為O( n log L)

空間複雜度:

空間成本耗費在minHeap上,最大大小和梯子數量一樣多,最大所需空間為O(L)。


關鍵知識點

比較之後,知道梯子的功能比較強,先盡可能用梯子往右邊的高樓爬,如果梯子用完了,嘗試從前面已經看過高度差值最小的大樓取回梯子,用磚塊疊回去替代,假如最後磚塊也用完了,那當下這棟就是能抵達的最遠那一棟大樓。


Reference:

[1] Furthest Building You Can Reach - LeetCode

86會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 題目會給我們一個陣列prices,裡面的數值代表每一個交易日的股票股價。 每次買入股票時會有一個額外附帶的交易成本fee。 題目讓我們做多,而且不限制交易次數。 題目禁止持有多重部位,也就是說,必須是買賣輪流交替的形式。 比如說 買,買,買 這種方式是不被允許的。 請問最終
題目敘述 題目會給我們泰伯納西數列的一般項和初始條件,要求我們實現找出第n項的function。 def tribonacci(self, n: int): 泰伯納西數列的一般項: Tn+3 = Tn + Tn+1 + Tn+2 for n >= 0. 泰伯納西數列的初始條件: T0 = 0,
題目敘述 題目會給我們一個輸入整數陣列arr,和一個初始化的刪除次數k? 我們可以任意選擇從arr中刪除k個陣列元素,請問最後留下來的數字,最少會有幾個不同的數字? 註: 最後不同的數字越少越好。 題目的原文敘述 測試範例 Example 1: Input: arr = [5,5
題目敘述 題目會給定我們一個n值,要求我們列出從0 ~ n 之間,每個整數有幾個bit1,以陣列的形式返回答案。 例如n=3時 因為 0 = 0b 0 1 = 0b 1 2 = 0b 10 3 = 0b 11 輸出答案為[0, 1, 1, 2] 題目的原文敘述 測試範例 E
題目敘述 題目會給我們一個參數k 和 目標值n。 請問我們從1~9內挑k個相異的數字,使得他們的總和為n 的組合數有多少? 挑選時,每個數字必須相異,而且每個數字只能選一次。 題目的原文敘述 測試範例 Example 1: Input: k = 3, n = 7 Output: [
題目敘述 題目會給定我們輸入邊長陣列nums,請問我們從裡面能夠建構出來的多邊形的最大周長是多少? 如果無解,返回-1 題目的原文敘述 約束條件 Constraints: 3 <= n <= 10^5 輸入陣列長度nums介於3 ~ 十萬 之間。 1 <= nums[i] <=
題目敘述 題目會給我們一個陣列prices,裡面的數值代表每一個交易日的股票股價。 每次買入股票時會有一個額外附帶的交易成本fee。 題目讓我們做多,而且不限制交易次數。 題目禁止持有多重部位,也就是說,必須是買賣輪流交替的形式。 比如說 買,買,買 這種方式是不被允許的。 請問最終
題目敘述 題目會給我們泰伯納西數列的一般項和初始條件,要求我們實現找出第n項的function。 def tribonacci(self, n: int): 泰伯納西數列的一般項: Tn+3 = Tn + Tn+1 + Tn+2 for n >= 0. 泰伯納西數列的初始條件: T0 = 0,
題目敘述 題目會給我們一個輸入整數陣列arr,和一個初始化的刪除次數k? 我們可以任意選擇從arr中刪除k個陣列元素,請問最後留下來的數字,最少會有幾個不同的數字? 註: 最後不同的數字越少越好。 題目的原文敘述 測試範例 Example 1: Input: arr = [5,5
題目敘述 題目會給定我們一個n值,要求我們列出從0 ~ n 之間,每個整數有幾個bit1,以陣列的形式返回答案。 例如n=3時 因為 0 = 0b 0 1 = 0b 1 2 = 0b 10 3 = 0b 11 輸出答案為[0, 1, 1, 2] 題目的原文敘述 測試範例 E
題目敘述 題目會給我們一個參數k 和 目標值n。 請問我們從1~9內挑k個相異的數字,使得他們的總和為n 的組合數有多少? 挑選時,每個數字必須相異,而且每個數字只能選一次。 題目的原文敘述 測試範例 Example 1: Input: k = 3, n = 7 Output: [
題目敘述 題目會給定我們輸入邊長陣列nums,請問我們從裡面能夠建構出來的多邊形的最大周長是多少? 如果無解,返回-1 題目的原文敘述 約束條件 Constraints: 3 <= n <= 10^5 輸入陣列長度nums介於3 ~ 十萬 之間。 1 <= nums[i] <=
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
女人體內最神奇的組織 為何是子宮內膜呢? 知道之前先來回答這題吧! 請問每個月的好朋友,月經,是內膜的哪一層在出血呢?
Thumbnail
《馬克白》告訴我們:最狠毒的巫術來自於最黑暗的人心,人心其實才是最可怕的
Thumbnail
大家好,最近我買了一個新的寵物訓練道具叫做「響片」,今天要和大家分享一下我的使用心得和建議!😻
預測產品行為 預測性的成果,精神上就相當於經驗公式,具體就會像是Intel或AMD所提供的CPU thermal model這種。經過校正後的模型得出的結果在誤差上原則可以小於5%,可以用來預測產品行為,提供廠商開發散熱片的模型。一個模型要準,勢必得投入測量值去校正材料參數或是取得等效參數。
Thumbnail
筆者日前受邀參與財團法人資訊工業策進會舉辦的「數位分身與沙盒法制環境建構研析」專家座談會,發現新加坡與英國正在進行這樣的「數據模擬分析」專案計畫,實在很像電玩遊戲「模擬城市」(SimCity),其中衍生國家、城市乃至於個人的元宇宙與數位分身(Digital Twin),可應用於分析風險的高低、測試政
Thumbnail
在作模擬的時候,這個準不準這個問題絕對有資格被排在常見問題中的前三名。 當然也是我們首先要問自己的部分。如果人家要拿這份結果去做設計評估,那他的準確性到哪? 如果不能拿來做設計參考,那我們該怎麼解讀? 而準不準的問題,要分成事前諸葛和事後諸葛兩種應用來討論。 事後諸葛的類型 事前諸葛的類型
Thumbnail
你對愛情有憧憬嗎?你心中所嚮往的「理想愛情」是什麼模樣呢?日本女性雜誌anan最近分享了一則有趣的心理測驗,從圖中四朵不同顏色、形狀的鬱金香中選擇最吸引你的一朵,一窺你內心渴望的愛情樣貌。「鬱金香」象徵著你的生活方式與價值觀,而顏色則代表哪種特質的伴侶最適合你,一起來測測看吧! A:粉色鬱金香 .
Thumbnail
愛麗絲跟絕大部份的姊妹們一樣,都是自己獨力打掃家裡的。如果是剛認識的朋友,甚至會以為愛麗絲有潔癖!其實,在一個乾淨整潔的環境中,不論是工作或是休息,才是最舒服的啊! 如今疫情來勢洶洶,清潔、抗菌輔助用品當道,但是,像 CeraLiv 推出的 ENHANCE居家防護鍍膜液 這樣多功能的產品,是之前沒
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
女人體內最神奇的組織 為何是子宮內膜呢? 知道之前先來回答這題吧! 請問每個月的好朋友,月經,是內膜的哪一層在出血呢?
Thumbnail
《馬克白》告訴我們:最狠毒的巫術來自於最黑暗的人心,人心其實才是最可怕的
Thumbnail
大家好,最近我買了一個新的寵物訓練道具叫做「響片」,今天要和大家分享一下我的使用心得和建議!😻
預測產品行為 預測性的成果,精神上就相當於經驗公式,具體就會像是Intel或AMD所提供的CPU thermal model這種。經過校正後的模型得出的結果在誤差上原則可以小於5%,可以用來預測產品行為,提供廠商開發散熱片的模型。一個模型要準,勢必得投入測量值去校正材料參數或是取得等效參數。
Thumbnail
筆者日前受邀參與財團法人資訊工業策進會舉辦的「數位分身與沙盒法制環境建構研析」專家座談會,發現新加坡與英國正在進行這樣的「數據模擬分析」專案計畫,實在很像電玩遊戲「模擬城市」(SimCity),其中衍生國家、城市乃至於個人的元宇宙與數位分身(Digital Twin),可應用於分析風險的高低、測試政
Thumbnail
在作模擬的時候,這個準不準這個問題絕對有資格被排在常見問題中的前三名。 當然也是我們首先要問自己的部分。如果人家要拿這份結果去做設計評估,那他的準確性到哪? 如果不能拿來做設計參考,那我們該怎麼解讀? 而準不準的問題,要分成事前諸葛和事後諸葛兩種應用來討論。 事後諸葛的類型 事前諸葛的類型
Thumbnail
你對愛情有憧憬嗎?你心中所嚮往的「理想愛情」是什麼模樣呢?日本女性雜誌anan最近分享了一則有趣的心理測驗,從圖中四朵不同顏色、形狀的鬱金香中選擇最吸引你的一朵,一窺你內心渴望的愛情樣貌。「鬱金香」象徵著你的生活方式與價值觀,而顏色則代表哪種特質的伴侶最適合你,一起來測測看吧! A:粉色鬱金香 .
Thumbnail
愛麗絲跟絕大部份的姊妹們一樣,都是自己獨力打掃家裡的。如果是剛認識的朋友,甚至會以為愛麗絲有潔癖!其實,在一個乾淨整潔的環境中,不論是工作或是休息,才是最舒服的啊! 如今疫情來勢洶洶,清潔、抗菌輔助用品當道,但是,像 CeraLiv 推出的 ENHANCE居家防護鍍膜液 這樣多功能的產品,是之前沒