Leetcode 每日一题【300】

源码:class Solution {

public:

    int lengthOfLIS(vector& nums) {

        int n=(int)nums.size();

        if(n==0)

        return 0;

        vectordp(n,0);

        for(int i=0;i

            dp[i]=1;

            for(int j=0;j

            if(nums[i]>nums[j])

            dp[i]=max(dp[i],dp[j]+1);

        }

        return *max_element(dp.begin(),dp.end());

    }

};


代码分析:之前没系统学习过动态规划,不是很懂,今天总归是看懂了这个题目。核心思路在于创建一个大小和nums一致的数组dp用来记录每个数的大小信息,具体操作上在外出循环第一次遍历时,将每个数的位置对应的dp[ ]记录为一,因为在n==0排除的情况下,可以说每一个数都有一个比它小的数,就是自己。进入内层循环,遍历外层的数前面的所有数,(nums[i]>nums[j])当找到比自己小的数时,这个数的记录dp[i]的大小就是 dp[i]=max(dp[i],dp[j]+1),原理是假设此时dp[i]和dp[j]都等于1,此时检测到(nums[i]>nums[j])也就是已知说我nums[i]>你nums[j]而此时dp[j]=1说明在nums[j]之前也有一个数小于他,所有nums[i]前面就有两个数小于他,所有他当然就等于dp[j]+1。

你可能感兴趣的:(Leetcode 每日一题【300】)