zoukankan      html  css  js  c++  java
  • 5841. 找出到每个位置为止最长的有效障碍赛跑路线 力扣(困难) 最长不下降 第 253 场力扣周赛AK

    前言:

    5838. 检查字符串是否为数组前缀  (简答)水题,题目要读清楚

    5839. 移除石子使总数最小  (中等)非常简单,用个优先队列即可

    5840. 使字符串平衡的最小交换次数  (中等)wa了两发,找到了规律

    5841. 找出到每个位置为止最长的有效障碍赛跑路线   (困难)  最长不下降

    你打算构建一些障碍赛跑路线。给你一个 下标从 0 开始 的整数数组 obstacles ,数组长度为 n ,其中 obstacles[i] 表示第 i 个障碍的高度。

    对于每个介于 0 和 n - 1 之间(包含 0 和 n - 1)的下标  i ,在满足下述条件的前提下,请你找出 obstacles 能构成的最长障碍路线的长度:

    你可以选择下标介于 0 到 i 之间(包含 0 和 i)的任意个障碍。
    在这条路线中,必须包含第 i 个障碍。
    你必须按障碍在 obstacles 中的 出现顺序 布置这些障碍。
    除第一个障碍外,路线中每个障碍的高度都必须和前一个障碍 相同 或者 更高 。
    返回长度为 n 的答案数组 ans ,其中 ans[i] 是上面所述的下标 i 对应的最长障碍赛跑路线的长度。

    示例 1:

    输入:obstacles = [1,2,3,2]
    输出:[1,2,3,3]
    解释:每个位置的最长有效障碍路线是:
    - i = 0: [1], [1] 长度为 1
    - i = 1: [1,2], [1,2] 长度为 2
    - i = 2: [1,2,3], [1,2,3] 长度为 3
    - i = 3: [1,2,3,2], [1,2,2] 长度为 3

    主要还是记录一下最长不下降的写法!!

    代码:

    class Solution {
    public:
        vector<int> longestObstacleCourseAtEachPosition(vector<int>& obstacles) {
        vector<int> a;
        vector<int> res;
        for(auto i:obstacles)
        {
            auto k=upper_bound(a.begin(),a.end(),i);
            if(k==a.end()) {a.push_back(i); res.push_back(a.size());}
              else
              {
                   *k=i;    // 改vector a中的值
                   res.push_back((k-a.begin())+1);   
              }
        }
            return res;
        }
    };
  • 相关阅读:
    终于回来了&&邮递员送信
    发射站
    黑匣子
    利维坦——(1)
    预告
    整除(水题)
    BZOJ054_移动玩具_KEY
    BZOJ4034_树上操作_KEY
    树链剖分学习&BZOJ1036
    BZOJ1208_宠物收养所_KEY
  • 原文地址:https://www.cnblogs.com/stepping/p/15115154.html
Copyright © 2011-2022 走看看