当前位置:网站首页>leetcode 1642. Furthest Building You Can Reach(能到达的最远的建筑)
leetcode 1642. Furthest Building You Can Reach(能到达的最远的建筑)
2022-06-24 07:01:00 【蓝羽飞鸟】
You are given an integer array heights representing the heights of buildings, some bricks, and some ladders.
You start your journey from building 0 and move to the next building by possibly using bricks or ladders.
While moving from building i to building i+1 (0-indexed),
If the current building’s height is greater than or equal to the next building’s height, you do not need a ladder or bricks.
If the current building’s height is less than the next building’s height, you can either use one ladder or (h[i+1] - h[i]) bricks.
Return the furthest building index (0-indexed) you can reach if you use the given ladders and bricks optimally.
Example 1:
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.
你手上有砖和梯子两种工具,当下一个楼比当前楼更高的时候,就要借助砖或者梯子上去,
选砖的话就需要 高度差 块砖,选梯子的话只需要一个梯子。
问最远能到达第几个建筑,从下标0开始。
思路:
如果高度差很大的话,需要很多块砖,但是只需要一个梯子,
一个直觉的想法就是高度差最大的那几个用梯子,剩下的用砖,就能资源最大化,走得更远。
那显然高度差不是排好序的,也不能排序,毕竟楼就在那里不能移动。
所以有一个想法就是先用砖,砖不够的时候把目前为止最大的高度差的那个地方把砖换成梯子,同时把砖回收回来下次用。
那怎样找到目前为止最大的高度差呢,用最大堆即可。
public int furthestBuilding(int[] heights, int bricks, int ladders) {
int n = heights.length;
if(n == 1) return 0;
PriorityQueue<Integer> queue = new PriorityQueue<>(Collections.reverseOrder());
for(int i = 0; i < n - 1; i++) {
if(heights[i] >= heights[i+1]) continue;
bricks -= heights[i+1] - heights[i];
queue.add(heights[i+1] - heights[i]);
if(bricks < 0) {
bricks += queue.poll();
if(ladders > 0) ladders --;
else return i;
}
}
return n - 1;
}
上面这样写时间效率不高,因为每一步都要把高度差加到queue里
public int furthestBuilding(int[] heights, int bricks, int ladders) {
int n = heights.length;
if(n == 1) return 0;
PriorityQueue<Integer> queue = new PriorityQueue<>(Collections.reverseOrder());
int i;
for(i = 1; i < heights.length; i++) {
int heightDiff = heights[i] - heights[i - 1];
if(heightDiff <= 0) {
continue;
}
if(heightDiff <= bricks) {
bricks -= heightDiff;
queue.offer(heightDiff);
} else if(ladders > 0){
if(!queue.isEmpty() && queue.peek() > heightDiff) {
//有且有必要换时
bricks += queue.poll();
bricks -= heightDiff;
queue.offer(heightDiff);
}
ladders--;
} else {
break;
}
}
return i - 1;
}
边栏推荐
猜你喜欢
jwt(json web token)
中国芯片独角兽公司
2022 tea artist (intermediate) work license question bank and online simulation examination
Pat 1157: school anniversary
2022年流动式起重机司机特种作业证考试题库及在线模拟考试
Opencv实现图像的基本变换
Markdown 实现文内链接跳转
Question bank and simulation examination for operation certificate of refrigeration and air conditioning equipment in 2022
Small sample fault diagnosis - attention mechanism code - Implementation of bigru code parsing
ZUCC_ Principles of compiling language and compilation_ Experiment 02 fsharp Ocaml language
随机推荐
5 minutes, excellent customer service chat handling skills
2021-03-04 COMP9021第六节课笔记
Markdown to realize text link jump
os. path. Pits encountered during the use of join()
独立站运营中如何提升客户留存率?客户细分很重要!
2021-06-25: a batch of strings consisting only of lowercase letters (a~z) are put
新技术实战,一步步用Activity Results API封装权限申请库
(pkcs1) RSA public private key PEM file parsing
App Startup
貸款五級分類
MAYA重新拓布
Chart list Performance Optimization: minimum resource consumption in the visualization area
软件过程与项目管理期末复习与重点
JUC personal simple notes
MATLAB Camera Calibrator相机标定
成为IEEE学生会员
The article takes you to understand the security of Windows operating system and protect your computer from infringement
Several ways you can't move zero (sequel)
js滚动div滚动条到底部
Catégorie de prêt 5