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;
        }
    }
    
  • 相关阅读:
    分享一个MySQL分库分表备份脚本(原)
    mysql配置以及性能优化(转)
    redis 集群配置实战
    Debian安装fail2ban来防止扫描
    关于微信小程序,一些想法
    读书笔记:《HTML5开发手册》-- 现存元素的变化
    linux下如何使用vnstat查看服务器带宽流量统计
    在iOS微信浏览器中自动播放HTML5 audio(音乐)的2种正确方式
    VS自定义项目模板:[4]自定义模板的分组
    VS自定义项目模板:[3]创建自定义模板
  • 原文地址:https://www.cnblogs.com/mapoos/p/14706091.html
Copyright © 2011-2022 走看看