题解 | #最长递增子序列#

最长递增子序列

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

单调栈,并记录arr中各个元素对应的最长递增子序列的长度,用于寻找对应的最长递增子序列

class Solution {
public:
    /**
     * retrun the longest increasing subsequence
     * @param arr int整型vector the array
     * @return int整型vector
     */
    vector<int> LIS(vector<int>& arr) {
        // write code here
        vector<int> ans;
        int n = arr.size();
        if (n == 0) return ans;

        vector<int> dp(n, 1);

        for (int i = 0; i < n; ++i) {
            if (ans.empty() || (i > 0 && arr[i] > ans.back())) {
                ans.push_back(arr[i]);
                dp[i] = ans.size(); // 当前位置的最大长度 
            }
            else {
                int pos = lower_bound(ans.begin(), ans.end(), arr[i]) - ans.begin(); // 寻找第一个大于等于arr[1]的元素位置
                ans[pos] = arr[i];  // 替换为当前值arr[i]
                dp[i] = pos + 1;  // 当前位置的最大长度 
            }
        }
        // 第二步:填充最长递增子序列
        for (int i = n-1, j = ans.size(); j > 0; --i) {
            if (dp[i] == j) {   // 当前位置的长度 == 在ans中的位置
                ans[--j] = arr[i];
            }
        }
        return ans;
    }
};
全部评论

相关推荐

本神尊:看来是没招到小红薯上的人
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
湫湫湫不会java:先投着吧,大概率找不到实习,没实习的时候再加个项目,然后把个人评价和荣誉奖项删了,赶紧成为八股战神吧,没实习没学历,秋招机会估计不多,把握机会。或者说秋招时间去冲实习,春招冲offer,但是压力会比较大
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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