Сложность: medium
Дан массив целых чисел nums и целое число limit. Вернуть размер самой длинной непустой подстроки, такая что абсолютная разница между любыми двумя элементами этой подстроки меньше или равна limit.
Пример:
Input: nums = [8,2,4,7], limit = 4
Output: 2
Explanation: All subarrays are:
[8] with maximum absolute diff |8-8| = 0 <= 4.
[8,2] with maximum absolute diff |8-2| = 6 > 4.
[8,2,4] with maximum absolute diff |8-2| = 6 > 4.
[8,2,4,7] with maximum absolute diff |8-2| = 6 > 4.
[2] with maximum absolute diff |2-2| = 0 <= 4.
[2,4] with maximum absolute diff |2-4| = 2 <= 4.
[2,4,7] with maximum absolute diff |2-7| = 5 > 4.
[4] with maximum absolute diff |4-4| = 0 <= 4.
[4,7] with maximum absolute diff |4-7| = 3 <= 4.
[7] with maximum absolute diff |7-7| = 0 <= 4.
Therefore, the size of the longest subarray is 2.
👨💻 Алгоритм:
1⃣Инициализировать два дека (minDeque и maxDeque) для хранения минимальных и максимальных значений в текущем окне и переменную left для начала окна.
2⃣Итеративно добавлять элементы в дек, поддерживая условие абсолютной разницы между максимальным и минимальным элементом в окне, чтобы она была не больше limit, при необходимости сдвигая left.
3⃣Обновлять maxLength, проверяя максимальную длину текущего окна, и возвращать maxLength как результат.
😎 Решение:
#include <queue>
#include <vector>
class Solution {
public:
int longestSubarray(std::vector<int>& nums, int limit) {
std::priority_queue<std::pair<int, int>> maxHeap;
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<std::pair<int, int>>> minHeap;
int left = 0, maxLength = 0;
for (int right = 0; right < nums.size(); ++right) {
maxHeap.push({nums[right], right});
minHeap.push({nums[right], right});
while (maxHeap.top().first - minHeap.top().first > limit) {
left = std::min(maxHeap.top().second, minHeap.top().second) + 1;
while (maxHeap.top().second < left) {
maxHeap.pop();
}
while (minHeap.top().second < left) {
minHeap.pop();
}
}
maxLength = std::max(maxLength, right - left + 1);
}
return maxLength;
}
};
Ставь 👍 и забирай 📚 Базу знаний