http://blog.youkuaiyun.com/ztj111/archive/2008/07/31/2748152.aspx #include "stdafx.h" #include <iostream> #include <algorithm> using namespace std; //复杂度为O(N2 + N) = O(N2) int MaxLength(int arr[], int length) { int *res = new int[length]; for (int i = 0; i<length; i++) { res[i] = 1; //初始化默认的长度 for (int j = 0; j<i; j++)//找出前面最长的序列 { if (arr[i] > arr[j] && (res[j] + 1 > res[i])) res[i] = res[j] + 1; } } return *max_element(res, res + length); //查找最大的值 } //O(N2),若使用二分查找为O(N*logN) int MaxLength2(int arr[], int length) { int *maxV = new int[length + 1]; maxV[1] = arr[0]; //数组中第一个值,边界值 maxV[0] = *min_element(arr, arr+length) - 1;//数组中最小值,边界值 int *LIS = new int[length];//初始最长递增序列的信息 for(int i = 0; i<length; i++) LIS[i] = 1; int nMaxLIS = 1;//最长递增子序列的长度 for (int i = 1; i<length; i++) { int j; for (j = nMaxLIS; j>=0; j--) { if(arr[i] > maxV[j]) { LIS[i] = j + 1; break; } } //这个for可以换成二分查找 if (LIS[i] > nMaxLIS)//更新最长信息 { nMaxLIS = LIS[i]; maxV[LIS[i]] = arr[i]; } else if (maxV[j] < arr[i] && arr[i] < maxV[j+1]) { maxV[j+1] = arr[i]; } } return nMaxLIS; } int main() { int arr[] = {1, -1, 2, -3, 4, -5, 6, -7}; int len = sizeof(arr) / sizeof(*arr); int res = MaxLength2(arr, len); printf("The max length is %d/n", res); system("pause"); }