模擬: 最遠可以抵達的大樓 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
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
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居家防護鍍膜液 這樣多功能的產品,是之前沒