• [LeetCode] 1840. Maximum Building Height


    You want to build n new buildings in a city. The new buildings will be built in a line and are labeled from 1 to n.

    However, there are city restrictions on the heights of the new buildings:

    • The height of each building must be a non-negative integer.
    • The height of the first building must be 0.
    • The height difference between any two adjacent buildings cannot exceed 1.

    Additionally, there are city restrictions on the maximum height of specific buildings. These restrictions are given as a 2D integer array restrictions where restrictions[i] = [idi, maxHeighti] indicates that building idi must have a height less than or equal to maxHeighti.

    It is guaranteed that each building will appear at most once in restrictions, and building 1 will not be in restrictions.

    Return the maximum possible height of the tallest building.

    Example 1:

    Input: n = 5, restrictions = [[2,1],[4,1]]
    Output: 2
    Explanation: The green area in the image indicates the maximum allowed height for each building.
    We can build the buildings with heights [0,1,2,1,2], and the tallest building has a height of 2.

    Example 2:

    Input: n = 6, restrictions = []
    Output: 5
    Explanation: The green area in the image indicates the maximum allowed height for each building.
    We can build the buildings with heights [0,1,2,3,4,5], and the tallest building has a height of 5.
    

    Example 3:

    Input: n = 10, restrictions = [[5,3],[2,5],[7,4],[10,3]]
    Output: 5
    Explanation: The green area in the image indicates the maximum allowed height for each building.
    We can build the buildings with heights [0,1,2,3,3,4,4,5,4,3], and the tallest building has a height of 5.
    

    Constraints:

    • 2 <= n <= 109
    • 0 <= restrictions.length <= min(n - 1, 105)
    • 2 <= idi <= n
    • idi is unique.
    • 0 <= maxHeighti <= 109

    最高建筑高度。

    在一座城市里,你需要建 n 栋新的建筑。这些新的建筑会从 1 到 n 编号排成一列。

    这座城市对这些新建筑有一些规定:

    每栋建筑的高度必须是一个非负整数。
    第一栋建筑的高度 必须 是 0 。
    任意两栋相邻建筑的高度差 不能超过  1 。
    除此以外,某些建筑还有额外的最高高度限制。这些限制会以二维整数数组 restrictions 的形式给出,其中 restrictions[i] = [idi, maxHeighti] ,表示建筑 idi 的高度 不能超过 maxHeighti 。

    题目保证每栋建筑在 restrictions 中 至多出现一次 ,同时建筑 1 不会 出现在 restrictions 中。

    请你返回 最高 建筑能达到的 最高高度 。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/maximum-building-height
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    这道题是 hard。我参考了这个官方题解,写的很好。题目给的是一个一维数组,请你按照数组里给的 restrictions 的要求建造房子,并且房子的高度要按照 restrictions 来。思路和讲解我觉得可以直接参考官方题解,我这里直接贴出代码。

    时间O(nlogn)

    空间O(1)

    Java实现

     1 class Solution {
     2     public int maxBuilding(int n, int[][] r) {
     3         // corner case
     4         if (r == null || r.length == 0) {
     5             return n - 1;
     6         }
     7 
     8         // normal case
     9         // Arrays.sort(r, Comparator.comparingInt(x -> x[0]));
    10         Arrays.sort(r, (a, b) -> a[0] - b[0]);
    11         int len = r.length;
    12         for (int i = len - 2; i >= 0; i--) {
    13             r[i][1] = Math.min(r[i][1], Math.min(r[i][0] - 1, r[i + 1][1] + r[i + 1][0] - r[i][0]));
    14         }
    15 
    16         int maxHeight = (0 + r[0][1] + r[0][0] - 1) / 2;
    17         for (int i = 1; i <= len - 1; i++) {
    18             r[i][1] = Math.min(r[i][1], Math.min(r[i][0] - 1, r[i - 1][1] + r[i][0] - r[i - 1][0]));
    19             maxHeight = Math.max(maxHeight, (r[i - 1][1] + r[i][1] + r[i][0] - r[i - 1][0]) / 2);
    20         }
    21         maxHeight = Math.max(maxHeight, r[len - 1][1] + n - r[len - 1][0]);
    22         return maxHeight;
    23     }
    24 }

    LeetCode 题目总结

  • 相关阅读:
    文件方式实现完整的英文词频统计实例
    组合数据类型练习,英文词频统计实例上
    英文词频统计预备,组合数据类型练习
    凯撒密码、GDP格式化输出、99乘法表
    字符串基本操作
    datetime处理日期和时间
    中文词频统计
    文件方式实现完整的英文词频统计实例
    组合数据类型练习,英文词频统计实例上
    英文词频统计预备,组合数据类型练习
  • 原文地址:https://www.cnblogs.com/cnoodle/p/14707205.html
Copyright © 2020-2023  润新知