긴 연속 상승 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();
}