Dynamic Programming Dynamic Programming Medium

Longest increasing subsequence

~2 mins read

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
Given an unsorted array of integers, find the length of longest increasing subsequence.

Example:

Input: [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. 
Note:

There may be more than one LIS combination, it is only necessary for you to return the length.
Your algorithm should run in O(n2) complexity.
Follow up: Could you improve it to O(n log n) time complexity?
*/


func lengthOfLIS(nums []int) int {
    if len(nums) == 0 {
        return 0
    }
    
    lis := make([]int, len(nums)) // lis[i] holds the length of max LIS up to the index i 

    lis[0]=1 // there is number itself, so it starts from 1 
    ans := 1 
    
    for i:=1; i<len(nums); i++{
        gt := 0 
        for j:=0; j<i; j++{
            if nums[i]>nums[j]{
                // when you are greater than a previous number
                // your sequence is at least as long as theirs or longer 
                gt = max(gt, lis[j]) 
            } 
        }
        lis[i] = gt + 1 // the current number is bigger than gt numbers before, including 
        ans = max(ans,lis[i])
    }
    return ans 
}

🎰