模擬: 最遠可以抵達的大樓 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

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給我們一個陣列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
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
  你有住過老式的舊公寓嗎?或是你有親戚、朋友住在裡頭?   就是一層有兩戶,一樓有獨立的圍籬和出入口,而住在二樓以上的住戶,則必須從兩家之間的鐵門進入樓梯空間的那種。   我很討厭傳統的舊公寓,每次開門看到樓梯轉角平台下方,那塊漆黑陰暗的空間就不舒服。   該怎麼說呢?總覺得陰影裡躲藏著什麼
Thumbnail
不想用電梯或走樓梯可以用扶手梯,過了這裏便到店的裏面。
Thumbnail
上班爬樓梯16樓的享受確實是獨特且令人滿足的。從爬樓梯的心法到成功登高101的經驗,這篇文章分享了爬樓梯的樂趣和方法。
Thumbnail
我在一棟不小的建築物內,有不少人。 我搭上了電梯。 出了電梯之後,發現腳上沒有穿鞋。 我認為我本來應該有穿著拖鞋。 "應該在電梯裡!",我這麼想。 我問問旁邊的人我們剛搭的是那一座電梯。 她指了指路, 我回去再次搭乘, 但總覺得和剛才搭乘的不同, 當然也沒找到拖鞋。
曼哈頓 這個桌遊是一個需要策略,要競爭又要合作的遊戲,在過程中要搶地盤,蓋越高樓、地盤最多或蓋在最上面的玩家可以加越多分,像我自己是在前面蓋的樓最高,就加了很多分領先,但後來在最後因為四層樓的大樓用完了,所以沒辦法把大樓蓋的更高,雖然把領先的大樓擋住了,讓其他人不能再佔領它,但後來其他三個人合
Thumbnail
若欲了解細節攻略,請私訊請加入「引路-勇敢壯遊趣」line群組 爬樓梯16樓的享受確實是獨特且令人滿足的。 首先,當大家匆匆趕著搭電梯等候時,你可以獨自在樓梯間,聆聽自己喜愛的Podcast,一步一步地慢慢前進。當你最終到達16樓時,會感受到成就感和自在感。 其次,這種獨自享受的樂趣令你陶
Thumbnail
你放心讓自己和家人這樣住嗎?
Thumbnail
無論看見了多少臺階, 無論走遍了多少街道, 也不管覆蓋屋頂的是什麼, 或者那片牆的建材有多特殊... 組成一座城市的不是那些, 而是「空間量度」與「過去事件」的關係, 欄杆的高度與翻過欄杆的志願者, 漁網的破洞與修補的老人們閒聊著話當年, 這些記憶, 清晰或模糊的過往, 城市被一
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
  你有住過老式的舊公寓嗎?或是你有親戚、朋友住在裡頭?   就是一層有兩戶,一樓有獨立的圍籬和出入口,而住在二樓以上的住戶,則必須從兩家之間的鐵門進入樓梯空間的那種。   我很討厭傳統的舊公寓,每次開門看到樓梯轉角平台下方,那塊漆黑陰暗的空間就不舒服。   該怎麼說呢?總覺得陰影裡躲藏著什麼
Thumbnail
不想用電梯或走樓梯可以用扶手梯,過了這裏便到店的裏面。
Thumbnail
上班爬樓梯16樓的享受確實是獨特且令人滿足的。從爬樓梯的心法到成功登高101的經驗,這篇文章分享了爬樓梯的樂趣和方法。
Thumbnail
我在一棟不小的建築物內,有不少人。 我搭上了電梯。 出了電梯之後,發現腳上沒有穿鞋。 我認為我本來應該有穿著拖鞋。 "應該在電梯裡!",我這麼想。 我問問旁邊的人我們剛搭的是那一座電梯。 她指了指路, 我回去再次搭乘, 但總覺得和剛才搭乘的不同, 當然也沒找到拖鞋。
曼哈頓 這個桌遊是一個需要策略,要競爭又要合作的遊戲,在過程中要搶地盤,蓋越高樓、地盤最多或蓋在最上面的玩家可以加越多分,像我自己是在前面蓋的樓最高,就加了很多分領先,但後來在最後因為四層樓的大樓用完了,所以沒辦法把大樓蓋的更高,雖然把領先的大樓擋住了,讓其他人不能再佔領它,但後來其他三個人合
Thumbnail
若欲了解細節攻略,請私訊請加入「引路-勇敢壯遊趣」line群組 爬樓梯16樓的享受確實是獨特且令人滿足的。 首先,當大家匆匆趕著搭電梯等候時,你可以獨自在樓梯間,聆聽自己喜愛的Podcast,一步一步地慢慢前進。當你最終到達16樓時,會感受到成就感和自在感。 其次,這種獨自享受的樂趣令你陶
Thumbnail
你放心讓自己和家人這樣住嗎?
Thumbnail
無論看見了多少臺階, 無論走遍了多少街道, 也不管覆蓋屋頂的是什麼, 或者那片牆的建材有多特殊... 組成一座城市的不是那些, 而是「空間量度」與「過去事件」的關係, 欄杆的高度與翻過欄杆的志願者, 漁網的破洞與修補的老人們閒聊著話當年, 這些記憶, 清晰或模糊的過往, 城市被一