【动态规划】 300. 最长递增子序列

  1. 最长递增子序列
// 方法一:动态规划O(N^2)
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int num_len = nums.size();
        int dp[num_len];
        dp[0] = 1;
        int result = 1;
        for(int i=1;i<num_len;++i){
            dp[i] = 1;
            for(int j=i-1;j>=0;--j)
                if(nums[i] > nums[j])
                    dp[i] = max(dp[j]+1, dp[i]);
            result = max(result, dp[i]);
        }
        return result;
    }
};

//方法二:贪心 + 二分 O(NlogN)
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int num_len = nums.size();
        int dp[num_len];
        int res = 0;
        dp[res] = nums[0];
        res ++;
        for(int i=1;i<num_len;++i){
            if(dp[res-1] < nums[i]){
                dp[res++] = nums[i];
            } else {
                int left = 0, right = res, flag = false;
                while(left < right){
                    int mid = left + ((right - left) >> 1);
                    if(dp[mid] == nums[i]){
                        flag = true;
                        break;
                    }
                    if(dp[mid] < nums[i]) left = mid + 1; 
                    else right = mid;
                }
                if(!flag)
                    dp[left] = nums[i];
                // for(int j=0;j<res;++j){
                //     cout <<dp[j] << " ";
                // }
                // cout << endl;
            }
        }
        return res;
    }
};
posted @ 2022-03-02 12:27  fwx  阅读(21)  评论(0)    收藏  举报