Leetcode_300_最长上升子序列

题目描述:给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:

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

算法思想:题目要求最长的上升序列,需要设置一个dp[]数组,用来记录最终的结果长度,dp[i]表示包含的序列最后一个元素是nums[i]的长度。dp[i]取值只有两种情况,第一种情况:当前面的元素都没有当前nums[i]元素值小,则dp[i]=1,即只包含自身元素,长度就是1。第二种情况:当前面存在比nums[i]小的元素,就将当前nums[i]添加到比nums[i]小的元素后面,dp[i]=dp[i]+1。
具体做法:初始化dp数组,dp[i]=1,ans=-1用于返回最大递增长度,当nums[i]>nums[j]时,并且dp[i]<dp[j]+1时,就更新dp[i]=dp[j]+1,计算出一个dp[i],就更新一下ans,ans=max(ans,dp[i]),最终ans就是最大递增子序列长度
i

代码实现:

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

猜你喜欢

转载自blog.csdn.net/all_about_WZY/article/details/89883960