Leetcode 1199. 建造街区的最短时间

1.题目基本信息

1.1.题目描述

你是个城市规划工作者,手里负责管辖一系列的街区。在这个街区列表中 blocks[i] = t 意味着第 i 个街区需要 t 个单位的时间来建造。

由于一个街区只能由一个工人来完成建造。

所以,一个工人要么需要再召唤一个工人(工人数增加 1);要么建造完一个街区后回家。这两个决定都需要花费一定的时间。

一个工人再召唤一个工人所花费的时间由整数 split 给出。

注意:如果两个工人同时召唤别的工人,那么他们的行为是并行的,所以时间花费仍然是 split。

最开始的时候只有 一个 工人,请你最后输出建造完所有街区所需要的最少时间。

1.2.题目地址

https://leetcode.cn/problems/minimum-time-to-build-blocks/description/

2.解题方法

2.1.解题思路

哈夫曼树。将最小的两个工作的最大值+选择工人的split时间合并为一个工作加入到堆中,使用哈夫曼的思路求最少时间

时间复杂度:O(nlog(n))

2.2.解题步骤

第一步,构建维护变量。使用heap最小堆维护哈夫曼树

第二步,不断从heap堆中弹出最小的两个元素,并取两者最大值加上split重新加入堆中,实现哈夫曼树的更新;直到heap中只剩下一个值,即为题解。

3.解题代码

Python代码

from heapq import heapify, heappush, heappop

class Solution:
    def minBuildTime(self, blocks: List[int], split: int) -> int:
        # 思路:哈夫曼树。将最小的两个工作的最大值+选择工人的split时间合并为一个工作加入到堆中,使用哈夫曼的思路求最少时间
        heap = blocks.copy()
        heapify(heap)
        while len(heap) > 1:
            a = heappop(heap)
            b = heappop(heap)
            heappush(heap, max(a, b) + split)
        return heap[0]


4.执行结果

posted @ 2025-05-22 16:28  Geek0070  阅读(12)  评论(0)    收藏  举报