题目链接:https://leetcode.cn/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/description/
题目大意:给出一个数组和一个limit
,求最长的子列,使得数组中任意两个数的差不超过limit
。
思路:实际就是保存子列的最大值和最小值,保证差不超过limit
就行。实际上贪心就行了,保留两个指针l, r
,r
一直增加,遇到不行的就修改l
。但数据结构上自己写的一直很冗杂,主要原因是因为最大值和最小值可以重复,【修改l
】这步太麻烦。看了题解才发现用STL的multiset最简单。
class Solution {
public:
int longestSubarray(vector<int>& nums, int limit) {
multiset<int> s;
int n = nums.size();
int l = 0, r = 0;
int ans = 1;
while (r < n) {
s.insert(nums[r]);
while (*s.rbegin() - *s.begin() > limit) {
s.erase(s.find(nums[l]));
l++;
}
ans = max(ans, r - l + 1);
r++;
}
return ans;
}
};