最长上升子序列

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大的数中最小的那个)

一共四个。

这个办法就是动态的维护一个递增序列,并且动态的把这个序列的每个数维持最小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值