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;
    }
};

 

posted on 2021-08-08 16:04  Yxter  阅读(56)  评论(0编辑  收藏  举报

导航