题解 | #最长递增子序列#(一个数组记录查找最长上升子序列的过程,后面较小值可能覆盖结果,需要记录值并回溯)

最长递增子序列

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

转载大佬&自己增加解释

class Solution {
public:
    vector<int> LIS(vector<int>&amp; arr) {
        vector<int> res; // 贪心下,用res数组存储最长上升子序列
        vector<int> maxLen;// maxLen[i]:加入arr[i]元素的最大长度。
        if (arr.size() &lt; 1) return res;
        res.emplace_back(arr[0]);  // emplace_back(val)作用同push_back,效率更高
        maxLen.emplace_back(1);
        for (int i = 1; i &lt; arr.size(); ++i) { 
            if (arr[i] &gt; res.back()) {
                res.emplace_back(arr[i]);  // 大于res中保存上升子序列的最后一个元素。 
                maxLen.emplace_back(res.size()); 
                //res记录且maxLen记录加入该元素时最大上升长度。 
            } else { 
                // 它的作用是返回有序数组begin..end中第一个大于等于val的元素的迭代器
                res[pos] = arr[i]; // 将arr[i]元素加入满足第一个大于它的元素处,此处贪心
        //不影响后续判断,在求最长上升子序列中,中间元素可以替换,记录后续情况。arr[i]替换res[pos]的原因
                maxLen.emplace_back(pos+1); // 记录以arr[i]结尾的最长长度。
            }
        }
        // 第二步:填充最长递增子序列,贪心时后面添加元素可能覆盖正确的升上子序列
        for (int i = arr.size()-1, j = res.size(); j &gt; 0; --i) {
            if (maxLen[i] == j) { 
         // 当以arr[i]结尾的最长长度是满足当前元素前最大上升子序列长度时,
         // res中的位置 替换成 arr[i] ,这样从前往后执行最后会得到序列最小的最长上升子序列。
                res[--j] = arr[i]; //j:是从1到res.size(),减1才对应在res中的位置
            }
        }
        return res;
    }
};
全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
躺尸修仙中:因为很多92的也去卷中小厂,反正投递简历不要钱,面试不要钱,时间冲突就推,不冲突就面试积累经验
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务