[LeetCode]300. Longest Increasing Subsequence

dp,最长递增子序列

Posted by JinFei on February 5, 2020

题目描述

Given an unsorted array of integers, find the length of longest increasing subsequence.

Example1:

Input: [10,9,2,5,3,7,101,18]
Output: 4
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.

Note:

  • There may be more than one LIS combination, it is only necessary for you to return the length.
  • Your algorithm should run in O(n2) complexity.

Follow up:

  • Could you improve it to O(n log n) time complexity?

解题思路

  • 动态规划
  • 时间复杂度为(O(n^2))
  • 首先dp数组的初始化,都初始化为1,表示本身自增
  • 两重循环,第一重循环 i -> nums.size()遍历这个数列,表示更新dp这个数组的值
  • 第二重循环,j -> i,表示遍历i之前的数列,遍历的过程中如果nums[i] > nums[j], 则可以用max(dp[i], dp[j] + 1)去更新dp[i]
  • 在这个过程中,找一个最大值,即为最后的结果。

C++代码

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> dp(nums.size(), 1);
        int res = 0;
        for(int i = 0; i < nums.size(); i++){
            for(int j = 0; j < i; j++){
                if(nums[i] > nums[j]){
                    dp[i] = max(dp[i], dp[j] + 1);
                }
            }
            if(dp[i] > res){
                res = dp[i];
            }
        }
        return res;
    }
};

0205解题思路

  • 动态规划
  • 对于第i个元素,对于 j < i,if(nums[i] > nums[j]),即可以用dp[j] + 1来更新dp[i], 这样一遍一边的扫描,最后即为最大
  • 肯定是两重循环
  • 有几个注意的点
    1. // int dp[nums.size()] = {1}; // 一维数组初始化 只会有第一个元素为1,其他都初始化为0,这一点也事刚认识到,下次要注意
    2. // 如果 i 从1 开始,那么当只有1个元素的时候 会错误

C++代码

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        // int dp[nums.size()] = {1};   // 一维数组初始化 只会有第一个元素为1,其他都初始化为0,这一点也事刚认识到,下次要注意
        vector<int> dp(nums.size(), 1);
        int res = 0;
        for(int i = 0; i < nums.size(); i++){   // 如果 i 从1 开始,那么当只有1个元素的时候 会错误
            for(int j = 0; j < i; j++){
                if(nums[i] > nums[j]){
                    dp[i] = max(dp[j] + 1, dp[i]);
                }
            }
            if(dp[i] > res){
                res = dp[i];
            }
        }
        return res;
    }
};