Longest Increasing Subsequence
Problem
Given an integer array nums
, return the length of the longest strictly increasing subsequence.
A subsequence is a sequence that can be derived from an array by deleting some or no elements without changing the order of the remaining elements. For example, [3,6,2,7]
is a subsequence of the array [0,3,1,6,2,2,7]
.
Example 1:
Input: nums = [10,9,2,5,3,7,101,18] Output: 4 Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.
Example 2:
Input: nums = [0,1,0,3,2,3] Output: 4
Example 3:
Input: nums = [7,7,7,7,7,7,7] Output: 1
Constraints:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
Solution
/**
* @param {number[]} nums
* @return {number}
*/
var lengthOfLIS = function(nums) {
let max = 1;
let dp = Array(nums.length).fill(1);
for (let i = 1; i < nums.length; ++i) {
for (let j = 0; j < i; ++j) {
if (nums[j] < nums[i]) {
dp[i] = Math.max(dp[j] + 1, dp[i]);
max = Math.max(dp[i], max);
}
}
}
return max;
};
We will implement a DP solution. Let dp[i]
be the longest increasing subsequence of nums[0:i + 1]
that includes (ie. ends at) nums[i]
.
- For the base case, if
i = 0
, then the longest increasing subsequence ofnums[0:1]
is1
. - For the recursive case, the longest increasing subsequence that include
nums[i]
is the longest previous subsequence that ends on a value less than the current element plus one (ie. iterate through all previous values indp
andnums
).
Note that we also keep track of the global max subsequence length to return.
Follow-up
Can you come up with an algorithm that runs in O(n log(n))
time complexity?