LeetCode 300. 最长上升子序列(C++)

题目描述:

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4 
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

解题思路:

这是一道动态规划问题。

可以看到这个题是一个经典的动态规划问题,那么在解一个动态规划的时候我们要确定:

解题代码:

class Solution {
public:
    int lengthOfLIS(vector& nums) {
        int size=nums.size();
        if(size==0){
            return 0;
        }
        int LIS=1;   //记录最长上升子序列的长度
        vector  dp(size,1);
        for (int i=0;inums[j]&&dp[i]


运行结果:

LeetCode 300. 最长上升子序列(C++)_第1张图片

 

解题思路2:

就是再新建一个数组,然后第一个数先放进去,然后第二个数和第一个数比较,如果说大于第一个数,那么就接在他后面,如果小于第一个数,那么就替换,一般的,如果有i个数,那么每进来一个新的数,都要用二分查找法来得知要替换在哪个位置的数。因为有个for循环,所以是O(N),在加上循环里有个二分查找,所以最后是O(NlogN)的时间复杂度。

代码实现:

class Solution {
public:
    int lengthOfLIS(vector& nums) {
        int size=nums.size();
        if(size==0){
            return 0;
        }
        int arr[size]={0};
        arr[0]=nums[0];
        int LIS=1;
        for(int i=1;iarr[mid]){
                    lo=mid+1;
                }else 
                    hi=mid;
                    
                }
                arr[lo]=nums[i];
               if(lo==LIS){
                   LIS++;
               }
          }
        return LIS;
        
    }
};

运行结果:

LeetCode 300. 最长上升子序列(C++)_第2张图片LeetCode 300. 最长上升子序列(C++)_第3张图片

你可能感兴趣的:(leetcode刷题之动态规划)