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 indpandnums).
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?