Longest Increasing Subsequence
Problem Statement
Given an array of numbers, find the length of the longest subsequence that’s strictly increasing. This medium-level DP challenge is like climbing a numerical ladder—how high can you go?
Example
Input: nums = [10, 9, 2, 5, 3, 7, 101, 18]
Output: 4 (2, 3, 7, 101)
Input: nums = [0, 1, 0, 3, 2, 3]
Output: 4 (0, 1, 2, 3)
Input: nums = [7, 7, 7]
Output: 1 (no increase possible)
Code
Java
Python
JavaScript
public class Solution {
public int lengthOfLIS(int[] nums) {
if (nums.length == 0) return 0;
int[] dp = new int[nums.length];
Arrays.fill(dp, 1);
int maxLen = 1;
for (int i = 1; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
maxLen = Math.max(maxLen, dp[i]);
}
return maxLen;
}
}
def length_of_lis(nums):
if not nums:
return 0
dp = [1] * len(nums)
for i in range(1, len(nums)):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
# Example usage
print(length_of_lis([10, 9, 2, 5, 3, 7, 101, 18])) # 4
print(length_of_lis([0, 1, 0, 3, 2, 3])) # 4
function lengthOfLIS(nums) {
if (!nums.length) return 0;
let dp = new Array(nums.length).fill(1);
for (let i = 1; i < nums.length; i++) {
for (let j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
return Math.max(...dp);
}
// Example usage
console.log(lengthOfLIS([10, 9, 2, 5, 3, 7, 101, 18])); // 4
console.log(lengthOfLIS([0, 1, 0, 3, 2, 3])); // 4-
Explanation
- DP Insight: dp[i] = longest increasing subsequence ending at i.
- Steps: For each num, check all prior nums; extend if greater.
- Flow Example ([2,5,3,7]): dp[0]=1, dp[1]=2 (2,5), dp[2]=2 (2,3), dp[3]=3 (2,3,7).
- Why It Works: Builds all possible increasing sequences.
Note
Time complexity: O(n²), Space complexity: O(n). Climb the ladder of numbers with DP grace!
