生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1642. 可以到达的最远建筑(二分查找 / 优先队列贪心)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 二分查找
- 2.2 優(yōu)先隊(duì)列+貪心
1. 題目
給你一個(gè)整數(shù)數(shù)組 heights ,表示建筑物的高度。另有一些磚塊 bricks 和梯子 ladders 。
你從建筑物 0 開始旅程,不斷向后面的建筑物移動(dòng),期間可能會(huì)用到磚塊或梯子。
當(dāng)從建筑物 i 移動(dòng)到建筑物 i+1(下標(biāo) 從 0 開始 )時(shí):
- 如果當(dāng)前建筑物的高度 大于或等于 下一建筑物的高度,則不需要梯子或磚塊
- 如果當(dāng)前建筑的高度 小于 下一個(gè)建筑的高度,您可以使用 一架梯子 或 (h[i+1] - h[i]) 個(gè)磚塊
如果以最佳方式使用給定的梯子和磚塊,返回你可以到達(dá)的最遠(yuǎn)建筑物的下標(biāo)(下標(biāo) 從 0 開始 )。
示例 1:
輸入:heights
= [4,2,7,6,9,14,12], bricks
= 5, ladders
= 1
輸出:
4
解釋:從建筑物
0 出發(fā),你可以按此方案完成旅程:
- 不使用磚塊或梯子到達(dá)建筑物
1 ,因?yàn)?
4 >= 2
- 使用
5 個(gè)磚塊到達(dá)建筑物
2 。你必須使用磚塊或梯子,因?yàn)?
2 < 7
- 不使用磚塊或梯子到達(dá)建筑物
3 ,因?yàn)?
7 >= 6
- 使用唯一的梯子到達(dá)建筑物
4 。你必須使用磚塊或梯子,因?yàn)?
6 < 9
無法越過建筑物
4 ,因?yàn)闆]有更多磚塊或梯子。示例
2:
輸入:heights
= [4,12,2,7,3,18,20,3,19], bricks
= 10, ladders
= 2
輸出:
7示例
3:
輸入:heights
= [14,3,19,3], bricks
= 17, ladders
= 0
輸出:
3提示:
1 <= heights
.length
<= 105
1 <= heights
[i
] <= 106
0 <= bricks
<= 109
0 <= ladders
<= heights
.length
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/furthest-building-you-can-reach
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
2. 解題
2.1 二分查找
- 提取出所能到的位置的需要的 正高度差,排序,優(yōu)先用梯子爬高的
class Solution {
public:int furthestBuilding(vector
<int>& heights
, int bricks
, int ladders
) {int l
= 1, r
= heights
.size()-1, ans
= 0, mid
;while(l
<= r
){mid
= l
+((r
-l
)>>1);if(canjump(heights
, bricks
, ladders
, mid
)){ ans
= mid
;l
= mid
+1;}elser
= mid
-1;}return ans
;}bool canjump(vector
<int>& heights
, int bricks
, int ladder
, int dest
){vector
<int> g
;for(int i
= 1; i
<= dest
; i
++)if(heights
[i
]-heights
[i
-1] > 0)g
.push_back(heights
[i
]-heights
[i
-1]);sort(g
.begin(), g
.end(), greater
<int>());int i
= 0;for(; i
< g
.size(); i
++){if(ladder
)ladder
--;else if(bricks
-g
[i
] >= 0)bricks
-= g
[i
];else if(bricks
-g
[i
] < 0)break;}return i
== g
.size();}
};
1736 ms 76.2 MB
2.2 優(yōu)先隊(duì)列+貪心
參考:zerotrac 🌸
- 使用size最大為 ladder 的優(yōu)先隊(duì)列(小的優(yōu)先),存儲(chǔ)正高度差,一旦size 超過了,說明需要使用磚塊了
- 累計(jì)使用磚塊超過 bricks 時(shí)結(jié)束
class Solution {
public:int furthestBuilding(vector
<int>& heights
, int bricks
, int ladders
) {priority_queue
<int,vector
<int>,greater
<int>> q
;int needbricks
= 0;for(int i
= 1; i
< heights
.size(); i
++) {int h
= heights
[i
]-heights
[i
-1];if(h
> 0){q
.push(h
);if(q
.size() > ladders
){needbricks
+= q
.top();q
.pop();}if(needbricks
> bricks
)return i
-1;}}return heights
.size()-1;}
};
328 ms 44.8 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長(zhǎng)按或掃碼關(guān)注我的公眾號(hào)(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!
總結(jié)
以上是生活随笔為你收集整理的LeetCode 1642. 可以到达的最远建筑(二分查找 / 优先队列贪心)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。