Logest Increasing Subsequence
Longest increasing subarray
我到现在还是不明白,subsequence和sebarray 到底那个是连续的。那个不连续。
如果是连续的,双向指针就能解决。
但是不连续的,就得是leetcode 300了。
300. Longest Increasing Subsequence
做法有两种,一种DP。
dp 代表到当前index位置的 最大LIS
从当前index 位置之前开始搜索比如j < index.
如果j位置的数值比index小。那就能拼成一个LIS。
所以想法就是遍历所有的比index小的位置的数,看能不能拼成一个LIS。
如果能,就把dp[j]的数值+1. 简单说就是尝试每个之前的位置看能不能拼接程成LIS。并赋值dp为最长的那个LIS。
这个算法的复杂度是N to the power of 2
算法还可以优化。
比如 [10,9,2,5,3,7,101,18]
可以维护个递增的vector
当当前元素大于vector 最后一个元素的时候,就push进去维护这个递增的序列。
当当前元素小于vector 最后一个元素的时候, 比如当前元素是9,要push进vector{10}。
把当前元素替换最小的大于这个元素的数,就是把9替换10 为{9}。 这样元素个数也没有变化。但是数小了。
为啥这么做那?就是为了能有更多的数能被push进这个vector。
比如当前要插入的是8, 当前vector是{1, 4, 5, 7, 100}。如果不把8替换100, 大于100的数目就会少很多。
继续来说。
10 被9 替换后, vector<9>.
2 插入,vector: {2} 比2 搭的数中最小的是9. 9被2替换
5 插入, vector:{2,5}
3 插入 vector: {2, 3}
7 插入vector:{2,3 7}
101 插入vector {2,3,7,101}
18 插入vector{2,3,7,18},替换101(比18大的数中最小的那个)
一共四个。
这个办法就是动态的维护一个递增序列,并且动态的把这个序列的每个数维持最小。