Skip to main content

300. Longest Increasing Subsequence

https://leetcode.com/problems/longest-increasing-subsequence/

Python

Bottom-Up DP

  • Time: O(N**2)
  • Space: O(N)
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
dp = [1]*len(nums)

for i in range(len(nums)):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j]+1)

return max(dp)

Javascript

/**
* @param {number[]} nums
* @return {number}
*/
var lengthOfLIS = function(nums) {
const dp = [];
for (let i = 0; i < nums.length; i++) {
const num = nums[i];
let left = 0;
let right = dp.length;
while (left < right) {
let mid = left + right >> 1;
if (num > dp[mid]) left = mid + 1;
else right = mid;
}
dp[left] = num;
}

return dp.length;
/*
const dp = [];
for (let i = 0; i < nums.length; i++) {
if (i === 0) dp[i] = 1;
else {
let tmp = 0;
for (let j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
tmp = Math.max(tmp, dp[j])
}
}
dp[i] = tmp + 1;
}
}

return Math.max.apply(null, dp)
*/
};