leetcode-1840. 最高建筑高度

leetcode-1840. 最高建筑高度在一座城市里,你需要建 n 栋新的建筑。这些新的建筑会从 1 到 n 编号排成一列。这座城市对这些新建筑有一些规定:每栋建筑的高度必须是一个非负整数。第一栋建筑的高度 必须 是 0 。任意两栋相邻建筑的高度差 不能超过 1 。除此以外,某些建筑还有额外的最高高度限制。这些限制会以二维整数数组 restrictions 的形式给出,其中 restrictions[i] = [idi, maxHeighti] ,表示建筑 idi 的高度 不能超过 maxHeighti 。题目保证每栋建筑在 res

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

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

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

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

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

示例 1:
在这里插入图片描述

输入:n = 5, restrictions = [[2,1],[4,1]]
输出:2
解释:上图中的绿色区域为每栋建筑被允许的最高高度。
我们可以使建筑高度分别为 [0,1,2,1,2] ,最高建筑的高度为 2 。
示例 2:
在这里插入图片描述

输入:n = 6, restrictions = []
输出:5
解释:上图中的绿色区域为每栋建筑被允许的最高高度。
我们可以使建筑高度分别为 [0,1,2,3,4,5] ,最高建筑的高度为 5 。
示例 3:
在这里插入图片描述

输入:n = 10, restrictions = [[5,3],[2,5],[7,4],[10,3]]
输出:5
解释:上图中的绿色区域为每栋建筑被允许的最高高度。
我们可以使建筑高度分别为 [0,1,2,3,3,4,4,5,4,3] ,最高建筑的高度为 5 。

提示:

2 <= n <= 109
0 <= restrictions.length <= min(n – 1, 105)
2 <= idi <= n
idi 是 唯一的 。
0 <= maxHeighti <= 109

题解1
暴力,会超时,从后往前遍历出来能够到达的最大高度。

class Solution { 
   
public:
    bool cmp(vector<int>&a,vector<int>&b){ 
   
        return a[0] < b[0];
    }
    const int INF = 0x3f3f3f3f;
    int maxBuilding(int n, vector<vector<int>>& restrictions) { 
   
        sort(restrictions.begin(),restrictions.end());
        int res = 0;
        vector<int>maxheight(n,INF);
        int m = restrictions.size();
        for(int i = 0;i < m;i ++){ 
   
            restrictions[i][0] = restrictions[i][0] - 1;
            cout<<restrictions[i][0]<<" ";
        }
        cout<<endl;
        for(int i = m - 1;i >= 0;i --){ 
   
            int prepox = 0;
            if(i >= 1)prepox = restrictions[i - 1][0];
            else prepox = 0;
            int nowheight = min(maxheight[restrictions[i][0]],restrictions[i][1]);
            for(int j = restrictions[i][0];j >= prepox;j --){ 
   
                maxheight[j] = nowheight + restrictions[i][0] - j;
            }
        }
        for(int i = 0;i < n;i ++){ 
   
            cout<<maxheight[i]<<" ";
        }
        cout<<endl;
        int now = 0;
        for(int i = 1;i < n;i ++){ 
   
            now = min(maxheight[i],now + 1);
            res = max(res,now);
        }

        return res;
    }
};

方法2:
limit的传递性,从左从右各扫一遍。

class Solution { 
   
public:
    bool cmp(vector<int>&a,vector<int>&b){ 
   
        return a[0] < b[0];
    }
    const int INF = 0x3f3f3f3f;
    int maxBuilding(int n, vector<vector<int>>& restrictions) { 
   
        restrictions.push_back({ 
   1,0});
        sort(restrictions.begin(),restrictions.end());
        if(restrictions[restrictions.size() - 1][0] != n){ 
   
            restrictions.push_back({ 
   n,n - 1});
        }
        int m = restrictions.size();
        auto &&r = restrictions;
        for(int i = 1;i < m;i ++){ 
   
            r[i][1] = min(r[i][1],r[i - 1][1] + r[i][0] - r[i - 1][0]);
        }
        for(int i = m - 2;i >= 0;i --){ 
   
            r[i][1] = min(r[i][1],r[i + 1][1] + r[i + 1][0] - r[i][0]);
        }
        int res = 0;
        for(int i = 1;i < m;i ++){ 
   
            res = max(res,(r[i][1] + r[i - 1][1] + r[i][0] - r[i - 1][0]) / 2);
        }
        return res;
    }
};
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168636.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android启动性能优化——闪屏及Splash页

    Android启动性能优化——闪屏及Splash页Android 启动性能优化 闪屏及 Splash 页本文我们将分析如何使用系统闪屏和 Splash 页来提升 APP 的启动性能 闪屏闪屏页是什么 启动闪屏不仅仅可以作为品牌宣传页 还能够减轻用户对启动耗时的感知 但是如果使用不恰当 将适得其反 当点击桌面图标启动 APP 的时候 程序会显示一个启动窗口 一直到页面的渲染加载完毕 如果程序的启动速度足够快 我们看的闪屏窗口停留显示的时间则会很短 但是当程序启动速度偏慢的时候 这个启动闪屏可以一定程度上减轻用户等待的焦虑感 避免用户过于轻易的关闭应用

    2025年6月3日
    0
  • 一代、二代、三代测序技术原理与比较「建议收藏」

    一代、二代、三代测序技术原理与比较「建议收藏」从1977年第一代DNA测序技术(Sanger法)1,发展至今三十多年时间,测序技术已取得了相当大的发展,从第一代到第三代乃至第四代,测序读长从长到短,再从短到长。虽然就当前形势看来第二代短读长测序技术在全球测序市场上仍然占有着绝对的优势位置,但第三和第四代测序技术也已在这一两年的时间中快速发展着。测序技术的每一次变革,也都对基因组研究,疾病医疗研究,药物研发,育种等领域产生巨大的推动作用。在这里我主要对当前的测序技术以及它们的测序原理做一个简单的小结。

    2022年5月17日
    90
  • java正则表达式验证手机号码_java邮箱判断合法正则表达式

    java正则表达式验证手机号码_java邮箱判断合法正则表达式java手机号正则表达式目前是截止2019年6月最新,适配各种手机号,满足常见号码验证importjava.util.regex.Matcher;importjava.util.regex.Pattern;importorg.apache.commons.lang3.StringUtils;/***@authorkpzc*三大运营商号码均可验证(不含卫星通信1349)*/publicclassmobile{/*<br>     2019

    2022年9月17日
    0
  • np.astype()

    np.astype()1.作用:就是转换numpy数组的数据类型举个例子arr=np.arange((10))print(arr,arr.dtype,sep=”\n”)===================================[0123456789]int32#可以看到,他的数据类型为int32np.astype()arr=arr.astype(“f…

    2022年6月10日
    46
  • MT4-EA自动化交易研究笔记(2022-04-23)

    MT4-EA自动化交易研究笔记(2022-04-23)目录昨日交易总体情况昨日EA更新内容待解决问题/对于交易策略的思考当前在用的EA介绍昨日交易总体情况实盘(第一张)与模拟盘(第二张)盈利情况对比图存在问题及分析昨天的实盘收益又是只有模拟盘的一半,原因还是对自己的交易系统不够自信,怕出现大行情大亏而根据自己的经验只跟了部分信号,有些信号开单前我把自动EA给关闭了,事后证明那些信号都是对的。昨天模拟盘是全程开着自动EA,无人工干预的,对于下午的那场大跌,虽然开仓有点早,而且是反向的,不过经过我的加仓策略,最终还是盈利出…

    2022年5月30日
    37
  • kubeadm安装k8s 组件controller-manager 和scheduler状态 Unhealthy

    kubeadm安装k8s 组件controller-manager 和scheduler状态 Unhealthy

    2021年6月2日
    127

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号