긴 연속 상승 LeedCode_

긴 연속 상승 LeedCode_

주제 설명

주어진 정수 배열의 장애, 가장 긴 발견 상승 순서의 길이.

입력 : 10,9,2,5,3,7,101,18]
출력 : 4
설명 : 가장 긴 시퀀스는 [2,3,7,101 같이, 길이가 4 인 증가된다.

링크 : https://leetcode-cn.com/problems/longest-increasing-subsequence

방법 A : 동적 프로그래밍, O의 시간 복잡도 (N2)

지원 상태 어레이 레코드 수가 시퀀스 I의 긴 단부를 증가시키는 배열 요구의 최종 상태의 최대 값을 찾기 위해 이송 될

int lengthOfLIS1(vector<int>& nums) 
{
	int n = nums.size();
	if (n == 0)
		return 0;
	int maxsize=0;
	vector<int> f(n,1);						//状态位置f(i)表示以i结尾的最大上升序列的数量
	for (int i = 1; i < n; i++)
	{
		for (int j = 0; j < i; j++)
		{
			if (nums[i] > nums[j])
			{
				f[i] = max(f[j] + 1, f[i]);
			}
		}
		maxsize = max(maxsize, f[i]);
	}
	return maxsize;
}

방법 2 : 동적 프로그래밍 + 이진 검색
기록 전류 보조 배열을 이용한 방법은 시퀀스 코드 노트 주석 부를 상승

int lengthOfLIS2(vector<int>& nums)
{
	int n = nums.size();
	vector<int>dp;										//维护当前的最长序列的内容
	for (int i = 0; i < n; i++)
	{
		int left = 0;
		int right = dp.size();
		while (left < right)
		{
			int mid = left + (right - left) / 2;
			if (dp[mid] < nums[i])
			{
				left = mid + 1;
			}
			else
			{
				right = mid;
			}
		}
		if (right >= dp.size())
		{
			dp.push_back(nums[i]);					//当前的元素比最大值大,便插入
		}
		else
		{
			dp[right] = nums[i];					//当前的元素在范围之内,仅是修改内部的元素(在合适的位置替换元素),不改变数量
		}
	}
	return dp.size();
}
게시 28 개 원래 기사 · 원 찬양 6 ·은 10000 +를 볼

추천

출처blog.csdn.net/luncy_yuan/article/details/104070984