代码改变世界

Programe_Of_Beauty:2.16 求数组中最长递增子序列

2011-06-12 14:05  x_feng  阅读(180)  评论(0)    收藏  举报

问题:写一个时间复杂度尽可能低的程序,求一个一维数组中最长递增子序列的长度。如1,-1,2,-3,4,-5,6,-7.最长递增子序列:1,2,4,6或者-1,2,4,6…

分析:我们发现2前面是1或者-1对后面没有影响。用i来遍历数组。i=0时,arr[i] = 1就一个数,这时最长递增子序列为{1},i=1时,-1<1所以对-1来说,目前最长递增子序列为{-1}为1,i= 2时,2>1,2>-1对2来说,最长递增子序列为{1,2}或{-1,2}长度为2,当i = 3时,-3小于1,-1,2.所以当前最长子序列依然是{1,2}或{-1,2}长度为2,当i= 4时,4>-1,4>-1,4>2,4>-3再逐个比较,代码如下:

int BigSubAdd(int *arr, int n)
{
    int * Lis = new int[n];//用来记录以当前数字为结尾的最长递增子序列
    for (int i = 0; i < n; i++)
    {
        Lis[i] = 1;//初始每一个数字本身都是长度为1的子序列
        for (int j = 0; j < i; j++)//考察i前面所有的数字
        {
             if (arr[i] > arr[j] && Lis[j] + 1 > Lis[i])//我们发现这里重复比较了,能否有改进呢?让arr[i]只与前面的最长子序列的最大值比较
             {
                  Lis[i] = Lis[j] + 1;//更新以i为结尾的最长子序列
              }
        }
    }
    delete[] Lis;
    return Max(List);
}

改进:详见《编程之美》,自己想了一个方法,发现不完善,在改进中…………