题解 | #递减种子序列#

递减种子序列

https://www.nowcoder.com/practice/708a3a8603274fc7b5732c5e73617203

知识点

动态规划,数据结构优化

思路

此题数据范围较小,可以采用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();
    }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 18:35
简历上把1个月实习写成了3个月,会进行背调吗?
码农索隆:一个月有一个月的实习经历,三个月有三个月的实习经历
点赞 评论 收藏
分享
牛客83700679...:简历抄别人的,然后再投,有反馈就是简历不行,没反馈就是学历不行,多投多改只要技术不差机会总会有的
点赞 评论 收藏
分享
LemontreeN:有的兄弟有的我今天一天面了五场,4个二面一个hr面
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务