题解 | #最长上升子序列(三)#

最长上升子序列(三)

https://www.nowcoder.com/practice/9cf027bf54714ad889d4f30ff0ae5481

#include <vector>
class Solution {
public:
    /**
     * retrun the longest increasing subsequence
     * @param arr int整型vector the array
     * @return int整型vector
     */
    vector<int> LIS(vector<int>& arr) {
        int n = arr.size();
        vector<int> dp(1, -1), poslen(n);
        for (int i = 0; i < n; ++i) {
            if (arr[i] > dp.back()) {
                dp.push_back(arr[i]);
                poslen[i] = dp.size() - 1;
            } else {
                int pos = lower_bound(dp.begin() + 1, dp.end(), arr[i]) - dp.begin();
                // cout << arr[i] << " " << pos << endl;
                dp[pos] = arr[i];
                poslen[i] = pos;
            }
        }
        int len = dp.size() - 1;
        vector<int> res(len);
        for (int i = n - 1; i >= 0; --i) {
            if (poslen[i] == len) {
                res[--len] = arr[i];
            }
        }
        return res;
    }
};

思路:动态规划。dp数组下标表示当前能求到的最长子序列长度,dp[i]表示在最长子序列长度为i的情况下,序列的最后一个值。

由于本题不仅仅是求长度,还要写出子序列,而只取dp中的元素是不一定能构成最长子序列的。({1, 3, 4, 2}中最长子序列是{1, 3, 4},而根据dp得来的序列是{1, 2, 4})

所以增加一个poslen数组,用来记录以当前元素为最后一个数的最长子序列长度,这样就能在动态规划结束后,反向遍历arr来找到最长子序列中的数。

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 17:28
25届每天都在焦虑找工作的事情0offer情绪一直很低落硬撑着面了一个岗位岗位有应酬的成分面试的时候hr给我出各种场景题问的问题比较犀利&nbsp;有点压力面的感觉感觉有点回答不上来本来就压抑的情绪瞬间爆发了呢一瞬间特别想哭觉得自己特别没用没绷住掉眼泪了事后想想觉得自己挺有病的&nbsp;真的破大防了
喜欢唱跳rap小刺猬...:我觉得没关系吧,之前有一次面试leader给我压力面,我顶住了压力,结果入职的时候发现组里氛围很差,果断跑路。其实从面试就能大概看出组的情况,面试体验好的组倒是不一定好,但是面试体验不好的组。。。就很难说
面试尴尬现场
点赞 评论 收藏
分享
05-22 17:07
已编辑
门头沟学院 Java
程序员牛肉:都啥时候了还jb打蓝桥杯呢,有限找实习。
点赞 评论 收藏
分享
废物一个0offer:认真的吗二本本科找人工智能岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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