You are given an integer array nums and an integer k.
Find the longest subsequence of nums that meets the following requirements:
The subsequence is strictly increasing and
The difference between adjacent elements in the subsequence is at mostk.
Return the length of the longestsubsequence that meets the requirements.
A subsequence is an array that can be derived from another array by deleting some or no elements without changing the order of the remaining elements.
Example 1:
Input: nums = [4,2,1,4,3,4,5,8,15], k = 3
Output: 5
Explanation:
The longest subsequence that meets the requirements is [1,3,4,5,8].
The subsequence has a length of 5, so we return 5.
Note that the subsequence [1,3,4,5,8,15] does not meet the requirements because 15 - 8 = 7 is larger than 3.
Example 2:
Input: nums = [7,4,5,1,8,12,4,7], k = 5
Output: 4
Explanation:
The longest subsequence that meets the requirements is [4,5,8,12].
The subsequence has a length of 4, so we return 4.
Example 3:
Input: nums = [1,5], k = 1
Output: 1
Explanation:
The longest subsequence that meets the requirements is [1].
The subsequence has a length of 1, so we return 1.
Constraints:
1 <= nums.length <= 105
1 <= nums[i], k <= 105
Solutions
Solution 1: Segment Tree
We assume that \(f[v]\) represents the length of the longest increasing subsequence ending with the number \(v\).
We traverse each element \(v\) in the array \(nums\), with the state transition equation: \(f[v] = \max(f[v], f[x])\), where the range of \(x\) is \([v-k, v-1]\).
Therefore, we need a data structure to maintain the maximum value of the interval. It is not difficult to think of using a segment tree.
The segment tree divides the entire interval into multiple discontinuous subintervals, and the number of subintervals does not exceed \(log(width)\). To update the value of an element, only \(log(width)\) intervals need to be updated, and these intervals are all contained in a large interval that contains the element.
Each node of the segment tree represents an interval;
The segment tree has a unique root node, which represents the entire statistical range, such as \([1,N]\);
Each leaf node of the segment tree represents an elementary interval of length \(1\), \([x, x]\);
For each internal node \([l,r]\), its left child is \([l,mid]\), and the right child is \([mid+1,r]\), where \(mid = \left \lfloor \frac{l+r}{2} \right \rfloor\).
For this problem, the information maintained by the segment tree node is the maximum value within the interval range.
The time complexity is \(O(n \times \log n)\), where \(n\) is the length of the array \(nums\).