码迷,mamicode.com
首页 > 其他好文 > 详细

力扣第300题 最长上升子序列

时间:2020-03-17 19:06:48      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:==   不用   while   image   mic   第一个   一个   back   pre   

力扣第300题 最长上升子序列

技术图片

技术图片

class Solution {
    public:
    int lengthOfLIS(vector<int>& nums) {
        int size = nums.size();
        if (size == 0)
        {
            return 0;
        }
        vector<int> vec;
        int len = 1;
        vec.push_back(nums[0]);
        for (int i = 1; i < size; i++)
        {
            if (vec[len - 1] < nums[i])
            {
                vec.push_back(nums[i]);
                len++;
            }
            else
            {
                // 要替换掉在vec数组中第一个大于nums[i]的数, 此处边界问题需要考虑一下
                // right = len - 2是因为vec[len - 1] >= nums[i]所以不用考虑len - 1
                int left = 0, right = len - 2, pos = -1;
                while (left <= right)
                {
                    int mid = left + ((right - left) >> 1);
                    if (vec[mid] < nums[i])
                    {
                        pos = mid;
                        left = mid + 1;
                    }
                    else
                    {
                        right = mid - 1;
                    }
                }
                vec[pos + 1] = nums[i];
            }
        }
        return len;
    }
};

力扣第300题 最长上升子序列

标签:==   不用   while   image   mic   第一个   一个   back   pre   

原文地址:https://www.cnblogs.com/woodjay/p/12495141.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!