Challenge 45
Longest Increasing Subsequence
You are given an array of integers nums, find the length of the longest increasing subsequence. A subsequence is a sequence derived from the array by deleting some or no elements without changing the order of the remaining elements.
Example:
pub fn longest_increasing_subsequence(nums: Vec<i32>) -> usize { // your implementation goes here // don't touch the code in the main function below } fn main() { // Test 1: Standard case [10, 9, 2, 5, 3, 7, 101, 18] -> 4 (e.g., [2, 3, 7, 101]) let result1 = longest_increasing_subsequence(vec![10, 9, 2, 5, 3, 7, 101, 18]); let expected1 = 4; if result1 != expected1 { panic!("Test 1 failed: Expected {}, got {}", expected1, result1); } println!("Test 1 passed: longest_increasing_subsequence([10, 9, 2, 5, 3, 7, 101, 18]) = {}", result1); // Test 2: Repeated elements [7, 7, 7, 7, 7, 7] -> 1 let result2 = longest_increasing_subsequence(vec![7, 7, 7, 7, 7, 7]); let expected2 = 1; if result2 != expected2 { panic!("Test 2 failed: Expected {}, got {}", expected2, result2); } println!("Test 2 passed: longest_increasing_subsequence([7, 7, 7, 7, 7, 7]) = {}", result2); // Test 3: Strictly increasing [1, 2, 3, 4, 5, 6] -> 6 let result3 = longest_increasing_subsequence(vec![1, 2, 3, 4, 5, 6]); let expected3 = 6; if result3 != expected3 { panic!("Test 3 failed: Expected {}, got {}", expected3, result3); } println!("Test 3 passed: longest_increasing_subsequence([1, 2, 3, 4, 5, 6]) = {}", result3); // Test 4: Strictly decreasing [5, 4, 3, 2, 1] -> 1 let result4 = longest_increasing_subsequence(vec![5, 4, 3, 2, 1]); let expected4 = 1; if result4 != expected4 { panic!("Test 4 failed: Expected {}, got {}", expected4, result4); } println!("Test 4 passed: longest_increasing_subsequence([5, 4, 3, 2, 1]) = {}", result4); // Test 5: Mixed sequence [1, 3, 5, 4, 7] -> 4 (e.g., [1, 3, 4, 7]) let result5 = longest_increasing_subsequence(vec![1, 3, 5, 4, 7]); let expected5 = 4; if result5 != expected5 { panic!("Test 5 failed: Expected {}, got {}", expected5, result5); } println!("Test 5 passed: longest_increasing_subsequence([1, 3, 5, 4, 7]) = {}", result5); // Test 6: Repeated with subsequences [0, 1, 0, 3, 2, 3] -> 4 (e.g., [0, 1, 2, 3]) let result6 = longest_increasing_subsequence(vec![0, 1, 0, 3, 2, 3]); let expected6 = 4; if result6 != expected6 { panic!("Test 6 failed: Expected {}, got {}", expected6, result6); } println!("Test 6 passed: longest_increasing_subsequence([0, 1, 0, 3, 2, 3]) = {}", result6); // Test 7: Single element [5] -> 1 let result7 = longest_increasing_subsequence(vec![5]); let expected7 = 1; if result7 != expected7 { panic!("Test 7 failed: Expected {}, got {}", expected7, result7); } println!("Test 7 passed: longest_increasing_subsequence([5]) = {}", result7); }
Solution
Click to Show/Hide Solution
#![allow(unused)] fn main() { pub fn longest_increasing_subsequence(nums: Vec<i32>) -> usize { if nums.is_empty() { return 0; } let mut dp = vec![1; nums.len()]; let mut max_len = 1; for i in 1..nums.len() { for j in 0..i { if nums[i] > nums[j] { dp[i] = dp[i].max(dp[j] + 1); } } max_len = max_len.max(dp[i]); } max_len } }