Учитывая массив A
размера n
и число k
, найдите размер самой длинной возрастающей подпоследовательности (скажем, B[]
), где B[i+1] >= B[i] + k
.
2 <= n <= 10^6
A[i] <= 10^5
k <= 10^5
Пример ввода:
A = [1, 3, 1, 4, 5, 9, 12]
k = 2
The LIS in this case will be: [1, 3, 5, 9, 12]
Answer = 5
Как решить по сложности O(N * log(N))
(или лучше)?Ниже описан мой подход O(N^2 * log(N))
:
Я буду использовать структуру данных, аналогичную std::multiset
(в C ++).std::multiset
гарантирует, что все элементы в мультимножестве будут отсортированы в любой момент времени.
Я создам мультимножество пар std::multiset <pair <int, int> > V
, где первым элементом в паре будет элемент измассив A
, а второй элемент будет иметь размер самой длинной возрастающей подпоследовательности, так что LIS заканчивается в первом элементе пары.Кроме того, в каждом случае первая пара в мультимножестве будет <-∞, 0>
.
int answer() {
multiset < pair < int, int> > V;
V.insert(<-∞, 0>);
final_answer = 1
for (element e) in A {
maximum_possible = 1
for (pair p) in V {
if (p.first > e - k)
break;
maximum_possible = max(p.second + 1, maximum_possible)
}
V.insert(<A[i], maximum_possible>)
final_answer = max(final_answer, maximum_possible)
}
return final_answer;
}