前言:
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; } };