leetcode刷题之动态规划法NO.3

1.题目

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。
例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-increasing-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.解法一

2.1.思路

  • 明确题意:

    • 子串一定是连续的,而子序列不一定是连续的。
    • 使用例子来明确题意。
  • 定义状态dp(i):dp(i)是以nums[i]结尾的最大递增子序列的长度。

  • 写出状态方程(考虑dp(i)从哪里来或者是到哪里去):如下图1所示,根据归纳法可以写出状态方程为dp[i]=max(dp[j])+1,其中0≤j<i且num[j]<num[i]
    图2.1

2.2.实现

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> dp(nums.size()+1, 1);

        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);
                }
            }
        }

        int res = 0;
        for (int i=0; i<dp.size(); i++) {
            res = max(res, dp[i]);
        }

        return res;
    }
};

2.3.算法分析

  • 时间复杂度为O(n^2)
  • 空间复杂度为O(n)

3.解法二

4.总结

  • 对算法库中常用函数的使用。
posted @ 2021-11-28 23:04  曼路的个人博客  阅读(24)  评论(0)    收藏  举报