300. Longest Increasing Subsequence
题意
给定整数数组nums,返回最长严格递增子序列的长度。
子序列是一个序列,它可以通过删除某些元素或不删除任何元素而从数组中派生,而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。
思路
代码
#include <stdlib.h>
#include <stdio.h>
int lengthOfLIS(int* nums, int numsSize)
{
int answer = 1;
int arr[numsSize];
for (int i = 0; i < numsSize; i++)
arr[i] = 0;
arr[0] = nums[0];
int temp = 0;
int k = 0;
for (int i = 1; i < numsSize; i++)
{
if (nums[i] > arr[k])
{
arr[k + 1] = nums[i];
answer++;
k++;
continue;
}
if (nums[i] < arr[0])
{
temp = answer;
arr[0] = nums[i];
//i=-1;
continue;
}
if (answer == 1)
arr[0] = nums[i];
else
{
for (int j = 0; j < k; j++)
{
if (nums[i] > arr[j] && nums[i] <= arr[j + 1])
{
arr[j + 1] = nums[i];
break;
}
}
}
}
return answer > temp ? answer : temp;
}
//test
int main()
{
int num[5] = { 1,2,-10,-8,-7 };
printf("answer=%d", lengthOfLIS(num, 5));
return 0;
}
方法2(差别好像不大)
int lengthOfLIS(int* nums, int numsSize)
{
int answer = 0;
int arr[numsSize];
for (int i = 0; i < numsSize; i++)
arr[i] = 1;
for (int i = 1; i < numsSize; i++)
for (int j = 0; j < i; j++)
{
if (nums[i] > nums[j] && arr[i] < arr[j] + 1)
arr[i] = arr[j] + 1;
}
answer = arr[0];
for (int i = 0; i < numsSize; i++)
{
if (arr[i] > answer)
answer = arr[i];
}
return answer;
}