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;
        }
    }
    
  • 相关阅读:
    [BZOJ 1552] 排序机械臂
    [BZOJ 1124][POI 2008] 枪战 Maf
    [BZOJ 1647][USACO 2007 Open] Fliptile 翻格子游戏
    [BZOJ 1592] Making The Grade路面修整
    [BZOJ 3829][POI2014] FarmCraft
    [技术] 如何正确食用cnblogs的CSS定制
    [BZOJ 1458] 士兵占领
    今天写了一个Imageloader,,AndroidStudio报了Error:Execution failed for task ':app:mergeDebugResources'. > Error: Java.util.concurrent.ExecutionException: com.Android.ide.common.process.ProcessException: 这个错误
    Http响应码代表的含义
    获取WIFI列表,在旧手机上运行就没有问题,在新手机上就怎么也获取不到WIFI列表,长度一直为0,还不报异常,很疑惑。
  • 原文地址:https://www.cnblogs.com/mapoos/p/14706091.html
Copyright © 2011-2022 走看看