All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0201_0300.s0300_longest_increasing_subsequence.Solution.rs Maven / Gradle / Ivy

// #Medium #Top_100_Liked_Questions #Array #Dynamic_Programming #Binary_Search
// #Algorithm_II_Day_16_Dynamic_Programming #Binary_Search_II_Day_3 #Dynamic_Programming_I_Day_18
// #Udemy_Dynamic_Programming #Big_O_Time_O(n*log_n)_Space_O(n)
// #2024_09_12_Time_0_ms_(100.00%)_Space_2.1_MB_(100.00%)

impl Solution {
    pub fn length_of_lis(nums: Vec) -> i32 {
        if nums.is_empty() {
            return 0;
        }

        let mut dp = vec![i32::MAX; nums.len() + 1];
        let (mut left, mut right) = (1, 1);

        for &curr in nums.iter() {
            let (mut start, mut end) = (left, right);

            // Binary search to find the position to update
            while start + 1 < end {
                let mid = start + (end - start) / 2;
                if dp[mid as usize] > curr {
                    end = mid;
                } else {
                    start = mid;
                }
            }

            // Update the dp array
            if dp[start as usize] > curr {
                dp[start as usize] = curr;
            } else if curr > dp[start as usize] && curr < dp[end as usize] {
                dp[end as usize] = curr;
            } else if curr > dp[end as usize] {
                dp[end as usize + 1] = curr;
                right += 1;
            }
        }

        right
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy