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;
        }
    }
    
  • 相关阅读:
    ORACLE常用SQL(session&badSql)
    归档日志满解决方法
    SPRING MVC总结
    Java中分割字符串
    无废话ExtJs 入门教程二十一[继承:Extend]
    无废话ExtJs 入门教程二十[数据交互:AJAX]
    WAMP 80端口被Microsoft-HTTPAPI/2.0占用的解决办法
    WampServer安装图解教程
    vmware tools安装程序无法继续,Microsoft Runtime DLL安装程序未能完成安装。的解决方法
    WordPress添加网站图标
  • 原文地址:https://www.cnblogs.com/mapoos/p/14706091.html
Copyright © 2011-2022 走看看