1642-可以到达的最远建筑-贪心算法

题目


题目给了我们砖块和梯子,梯子可以直接翻上下一座建筑,所以梯子就相当于是可以使用一次的无限块砖块,那么怎么使用梯子显然是这道题的关键

核心思路

既然梯子是关键,那么我们该怎么使用梯子才能走的更远呢?
因为梯子的数量是固定的,那么如果用完梯子还能剩下尽量多的砖块,就可以走的尽可能远了。所以我们不妨使用一个小顶堆存储所有放梯子的位置梯子所代替的砖块的数量。这样堆顶存放的就是梯子代替的最少的砖块的数量。思路如下:

  • 优先使用梯子
  • 梯子用完之后用砖块顶替最少位置的梯子,然后把梯子挪到当前位置(尽可能省下砖块)
  • 哪怕省下尽可能多的砖块也无法继续前进时,直接返回当前位置

完整代码

class Solution {
    public int furthestBuilding(int[] h, int bricks, int ladders) {
        PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
        for (int i = 0; i < h.length - 1; i++) {
            if(h[i + 1] > h[i]){
                int diff = h[i + 1] - h[i];
                minHeap.add(diff);
                if(minHeap.size() > ladders){
                    bricks -= minHeap.poll();
                }
                if(bricks < 0) return i;
            }
        }
        return h.length - 1;
    }
}

这道题难度不算大,主要要想到堆的使用,然而我比赛时还是太菜,都没来得及做这题,只能下次继续努力了~
如果文章有写的不正确的地方还请指出,感恩相遇~~~

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容