leetcode 673 最长递增子序列的个数

简介: leetcode 673 最长递增子序列的个数

最长递增子序列的个数

递归(超时)

class Solution {
public:
    int result = 0;
    vector<int> path;
    int max_path = 0;
    void track_back(vector<int>& nums , int indnx)
    {
        if(path.size() > max_path)
        {
            max_path = path.size();
            result = 1;
        }else if(path.size() == max_path) result++;
        if(indnx >= nums.size() ) return;
        for(int i = indnx ;i<nums.size();i++)
        {
            if( (path.size() == 0)||(path.size() !=0 && nums[i] > path[path.size()-1]) ) 
            {
                path.push_back(nums[i]);
                track_back(nums,i+1);
                path.pop_back();
            }
        }
        return;
    }
    int findNumberOfLIS(vector<int>& nums) {
        track_back(nums,0);
        return result;
    }
};

动态规划

class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        vector<int> dp(nums.size(),1);//i以内的最长子序列
        vector<int> count(nums.size(),1);//i以内最长子序列的个数
        int max_long = 1;
        for(int i=1 ; i<nums.size() ;i++)
        {
            for(int j=0 ; j<i ; j++)
            {
                if(nums[i] > nums[j] && dp[i] < dp[j] + 1) //发现更长的最长子序列
                {
                    count[i] = count[j]; 
                    dp[i] =  dp[j] + 1;
                }else if(nums[i] > nums[j] && dp[i] == dp[j] + 1) //发现和当前最长一样长的
                {
                    count[i] += count[j];
                    dp[i] = dp[i];
                }else if(nums[i] > nums[j] && dp[i] <= dp[j] + 1) //没发现最长的
                {
                    dp[i] = dp[i];
                }
                if(dp[i] > max_long) max_long = dp[i];
            }
        }
        int result = 0;
        for(int i=0 ; i<nums.size() ;i++)
            if(dp[i] == max_long) result += count[i];
        return result;
    }
};
相关文章
|
6天前
|
存储 算法
《LeetCode》—— 摆动序列
《LeetCode》—— 摆动序列
|
6天前
|
算法 测试技术 C#
【单调栈】LeetCode2030:含特定字母的最小子序列
【单调栈】LeetCode2030:含特定字母的最小子序列
|
6天前
leetcode代码记录(最长连续递增序列
leetcode代码记录(最长连续递增序列
12 2
|
6天前
leetcode代码记录(最长递增子序列
leetcode代码记录(最长递增子序列
9 1
|
6天前
|
算法
leetcode代码记录(摆动序列
leetcode代码记录(摆动序列
9 0
|
6天前
|
存储
力扣187 重复DNA序列
力扣187 重复DNA序列
|
6天前
代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组
代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组
44 0
|
6天前
|
Java
leetcode 516. 最长回文子序列(JAVA)题解
leetcode 516. 最长回文子序列(JAVA)题解
27 0
|
6天前
|
算法 测试技术 C#
【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数
【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数
|
6天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
9 0