LeetCode 300. 最长递增子序列--动态规划+二分优化

  1. 最长递增子序列
    给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4
示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

提示:

1 <= nums.length <= 2500
-104 <= nums[i] <= 104

题解

一个裸题,关于最长上升子序列利用二分优化的,我们假设从左到右遍历不断更新一个数组,这个数组的元素来源于题目输入的nums,然后保证这个数组的元素不断递增,那么我们遍历的时候不断更新,
比如,一开始这个数组:为[1,4,5,8,9],然后遍历数组nums,如果nums[x]=6,我们去更新这个数组,因为这个数组的元素都是在位置x前面,不可能插入得到[1,4,5,6,8,9],只能根据贪心策略,去优化内容,变成
[1,4,5,6,9]。

AC代码

class Solution {
public:
    int dp[2510];
    int lengthOfLIS(vector<int>& nums) {
        int len=0;
        dp[0]=-1e5;
        for(int i=0;i<nums.size();i++)
        {
            int l=0,r=len,fin=-1;
            while(l<=r)
            {
                int mid=(l+r)/2;
                if(dp[mid]<nums[i])
                {
                    fin=mid;
                    l=mid+1;
                }
                else r=mid-1;
            }
            len=max(len,fin+1);
            dp[fin+1]=nums[i];
        }
        return len;
    }
};

LeetCode 300. 最长递增子序列--动态规划+二分优化_第1张图片

你可能感兴趣的:(LeetCode,二分查找,算法,leetcode,动态规划,数据结构)