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;
        }
    }
    
  • 相关阅读:
    bzoj4165 矩阵 堆维护多路归并
    bzoj2802 [Poi2012]Warehouse Store 贪心+堆
    bzoj1367 [Baltic2004]sequence 左偏树+贪心
    bzoj3011 [Usaco2012 Dec]Running Away From the Barn 左偏树
    uoj207 共价大爷游长沙 子树信息 LCT + 随机化 + 路径覆盖
    bzoj4764 弹飞大爷 LCT
    bzoj4817 & loj2001 [Sdoi2017]树点涂色 LCT + 线段树
    bzoj5020 & loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开
    bzoj4998 星球联盟 LCT + 并查集
    bzoj3091 城市旅行 LCT + 区间合并
  • 原文地址:https://www.cnblogs.com/mapoos/p/14706091.html
Copyright © 2011-2022 走看看