问题描述: 求一个一维数组的最长递增子序列,时间复杂度尽可能小。 例如:数组 1, -1,2,-3,4,-5,6,-7它的最长递增子序列是 1,2,4,6。
思路: 创建一个数组,用于记录到它为止递增元素的最大个数。 从目标数组的第一个元素开始,寻找从数组0元素开始到当前元素中间的递增的元素个数,并记录。
时间复杂度 O(N*N)。
#include <iostream>
using namespace std;
int getMaxSubSeq1(int arr[], int len)
{
int ret = 0;
int i = 0, j = 0;
int* pSub = new int[len];
for (i = 0; i < len; i++)
{
pSub[i] = 1;
for (j = 0; j < i; j++)
{
if ((arr[i] > arr[j]) && (pSub[i] < pSub[j]+1))
{
pSub[i] = pSub[j]+1;
if (pSub[i] > ret) ret = pSub[i];
}
}
}
delete[] pSub;
pSub = NULL;
return ret;
}
void main()
{
int i = 0, len = 0;
int test[] = {1, -1, 2, -3, 4, -5, 6, -7, 2};
//int test[] = {1, -1, 2, 3, 4, -5, 6, -7, 2};
//int test[] = {1, -1, 2, 3, 4, 5, 6, 7, 2};
len = sizeof(test)/sizeof(test[0]);
i = getMaxSubSeq1(test, len);
cout << "max len = "<< i << endl;
cin>> i;
}