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

最长递增子序列

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

贪心算法,遍历数组arr,每次都取尽量长的递增子序列,保存在result中;数组max_len用于保存arr[0,i]的元素中小于等于arr[i]的元素的个数。最后根据等式max_len[i]==j选择最终的结果,表示递增子序列的第j个元素应该这么选:它正好就是arr数组中的元素arr[i],满足arr[i]的前面有j个元素小于等于arr[i](也就是说此arr[i]是arr数组中的第j小元素)。

class Solution {
public:
    /**
     * retrun the longest increasing subsequence
     * @param arr int整型vector the array
     * @return int整型vector
     */
    vector<int> LIS(vector<int>& arr) {
        vector<int> result{};
        vector<int> max_len{}; //保存arr[0,i]中小于等于arr[i]的个数
        if(arr.empty()) return result;
        result.push_back(arr[0]);
        max_len.push_back(1);
        for(int i=1;i<arr.size();i++){
            if(arr[i]>result.back()){
                result.push_back(arr[i]);
                max_len.push_back(result.size());
            }
            else{
                int pos=lower_bound(result.begin(), result.end(), arr[i]) - result.begin();
                result[pos]=arr[i];
                max_len.push_back(pos+1);
            }
        }
        for(int i=arr.size()-1,j=result.size();j>0;i--){
            if(max_len[i]==j){
                result[--j]=arr[i];
            }
        }
        return result;
    }
};


全部评论

相关推荐

程序员牛肉:你这简历有啥值得拷打的?在牛客你这种简历一抓一大把,也就是个人信息不一样而已。 关键要去找亮点,亮点啊,整个简历都跟流水线生产出来的一样。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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