题解 | #最长上升子序列(一)#

最长上升子序列(一)

https://www.nowcoder.com/practice/5164f38b67f846fb8699e9352695cd2f

方法:动态规划

1、创建一个数组dp,记录下数组arr不同位置为结尾时的最长上升子序列长度,可以得到如下的状态方程:

如果存在arr[j] (j < i)小于该位置arr[i],通过遍历前序的元素得到:dp[i] = max(dp[i], 1 + dp[j]);

2、遍历完数组arr,数组dp中的最大值即为该数组的最长上升子序列长度。

时间复杂度:o(n2)

空间复杂度:o(n)

class Solution {
  public:
    int LIS(vector<int>& arr) {
        // 特殊情况处理
        if (arr.size() == 0)
            return 0;

        vector<int> dp(arr.size(), 1);
		// 初始化为1,只要有元素长度至少为1
        int max_len = 1;
        for (int i = 1; i < arr.size(); i++) {
            for (int j = 0; j < i; j++) {
                if (arr[i] > arr[j])
                    dp[i] = max(dp[i], 1 + dp[j]);
            }
            if (dp[i] > max_len)
                max_len = dp[i];
        }

        return max_len;
    }
};

刷题题解(c++) 文章被收录于专栏

算法题题解(c++)

全部评论

相关推荐

头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
流浪的神仙:无恶意,算法一般好像都得9硕才能干算法太卷啦
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务