最长上升子序列

题目

给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是[2,3,7,101],它的长度是 4。
说明:
可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为O(n2) 。
进阶: 你能将算法的时间复杂度降低到O(n log n) 吗

分析

	1.其实这个是一个动态规划的问题,优先从最小的入手。第一个元素其实就可以理解为第一个子序列。然后依次
	  往后进行比较。每次进入内层比较的时候,设置一个此次内层比较结果的最大值。
	2.进入内层后,从第一个元素开始算起,直到外层元素的下标,然后依次比较如果内层元素小于外层元素,则
	  取二者子序列长度最大值。
	3.从内层比较结束后,然后外层元素加1,因为这个是加上当下元素
	4.之所以只和外层元素比较,是因为,最开始是从最小元素比起,所以每个元素都对应了从开始到其位置的最长
	  子序列长度。

附注:
1.建立一个数组用来标记当下元素对应的最长子序列长度

#include<vector>
#include<algorithm>

using namespace std;

class MyClass
{
public:
	int lengthOfLIS(vector<int>& nums) {
		if (nums.empty()){
			return 0;
		}
		int len = nums.size();
		vector<int> dp(len, 0);
		int res = 1;
		dp[0] = 1;//dp存储的是子序列的长度

		for (int i = 1; i < len; ++i){
			int maxVal = 0;
			for (int j = 0; j < i; ++j){
				if (nums[j] < nums[i]){
					maxVal = max(dp[j], maxVal);
				}
			}
			dp[i] = maxVal + 1;
			res = max(res, dp[i]);
		}
		return res;
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值