知识点

动态规划,数据结构优化

思路

此题数据范围较小,可以采用O(NxN)的做法,即每一次遍历到seeds[i],都往回寻找最大的DP[1~i],其中dp[x]表示以第x位结尾的最大单调递减子序列长度,此方法较为简单。

本题中,笔者采用数据结构优化,将时间复杂度降低至O(NlogN)。思路为:将seeds[1]储存进一个栈s中,每次读取seeds[i],将它与栈顶的值作比较,若seed[i]<s.top(),则入栈,否则在栈中找到一个大于或等于seeds[i]的第一个数,并将其替换为seeds[i],以此维护继续延长为单调递减子序列的“潜力”。

栈中的数不一定是最终的单调递减子序列,但是栈的长度即为子序列长度。

本题中,为了方便查找和替换操作,考虑到栈的单调性,可以使用VECTOR模拟,并使用lower_bound函数进行二分查找

代码c++

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param seeds int整型vector 
     * @return int整型
     */
    int lengthOfLIS(vector<int>& seeds) {
        vector<int>s;
        s.push_back(seeds[0]);
        int cnt=0;
        for(int i=1;i<seeds.size();i++)
        {
            if(seeds[i]<s[cnt])
            {
                s.push_back(seeds[i]);
                cnt++;
            }
            else {
                auto temp=lower_bound(s.begin(),s.end(),seeds[i],greater<int>());
                *temp=seeds[i];
            }
            
        }
        return s.size();
    }
};