leetcode 300最长上升子序列

用递归DFS遍历所有组合肯定积分会超时,原因是有很多重复的操作,可以想象每次回溯后肯定会有重复操作。所以改用动态规划。建立一个vector<int>memo,初始化为1,每次a把当前数字当作是最后一个序列的最后一个数字,只看这个数字之前的数字,如果比他之前的数字大,那么选择这个数字之后最大上升序列长度+1,memo[i]=memo[j]+1.

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        if(nums.size()!=0)
        {
            vector<int>memo(nums.size() + 1, 1);
        int i;
        int j;
        for (i = 1; i <= nums.size() - 1; i++)
        {
            for (j = 0; j < i; j++)
            {
                if (nums[i] > nums[j])
                {
                    if (memo[i] < memo[j] + 1)
                    {
                        memo[i] = memo[j] + 1;
                    }
                }
            }
        }
        sort(memo.begin(), memo.end());
        return memo[memo.size() - 1];
        }
        else
            return 0;
    }
};

---恢复内容结束---

猜你喜欢

转载自www.cnblogs.com/legendcong/p/9150926.html