zoukankan      html  css  js  c++  java
  • 1642. Furthest Building You Can Reach (M)

    Furthest Building You Can Reach (M)

    题目

    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.
    

    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 <= heights[i] <= 10^6
    • 0 <= bricks <= 10^9
    • 0 <= ladders <= heights.length

    题意

    给定一个高度数组,从左到右移动。如果当前高度大于等于下一个高度,可以直接移动;如果当前高度小于下一个高度,记差为diff,则需要diff块砖或一个梯子才能移动到下一个位置,求能移动到的最远的位置。

    思路

    贪心。因为一个梯子能代替任意块砖,应该把梯子用在移动过程中差值最大的地方。做法如下:计算差值diff,如果小于等于0,直接移动;如果大于0,优先使用brick,并将diff加入优先队列,如果brick不够,则消耗一个ladder,置换出已消耗的最大diff返还给brick。


    代码实现

    Java

    class Solution {
        public int furthestBuilding(int[] heights, int bricks, int ladders) {
            int index = 0;
            Queue<Integer> top = new PriorityQueue<>((a, b) -> b - a);
    
            while (index + 1 < heights.length) {
                int diff = heights[index + 1] - heights[index];
    
                if (diff <= 0) {
                    index++;
                } else if (bricks >= diff) {
                    bricks -= diff;
                    top.offer(diff);
                    index++;
                } else if (ladders == 0) {
                    break;
                } else if (top.isEmpty() || top.peek() <= diff) {
                    ladders--;
                    index++;
                } else {
                    ladders--;
                    bricks += top.poll();
                    if (bricks >= diff) {
                        bricks -= diff;
                        top.offer(diff);
                        index++;
                    }
                }
            }
    
            return index;
        }
    }
    
  • 相关阅读:
    charles 的 常用功能
    Python中 for循环和while循环的区别
    python元祖,列表和字典区别
    docker 笔记
    mac终端上传下载文件到linux服务器
    索引
    在HTTP1.0协议中持续更新
    彻底理解Cookie session token
    Charles 看这一篇就够了
    最近学习java 项目 eclipse 安装插件后重启出现错误
  • 原文地址:https://www.cnblogs.com/mapoos/p/14706091.html
Copyright © 2011-2022 走看看