程序员面试题精选(49):最长递增子序列

 题目描述:L=<a1,a2,…,an>n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k12<…maK1k2<…km。求最大的m

代码实现如下:

#include "stdio.h"
#include

template < class  T >
int  GetLISLen(T  * arr,  int  n)
{
 if  (n  <   1 )
  return   0 ;
 
 int  iCurrMaxLen  =   0 ;
 int  left, right, mid;
 int   * last  =   new   int [n]();
   
    last[ 0 ]  =  arr[ 0 ];
   
 for  ( int  i  =   1 ; i  <  n; i ++ )
 {
  if  (arr[i]  >=  last[iCurrMaxLen])
            last[ ++ iCurrMaxLen]  =  arr[i];
  else   if  (arr[i]  <  last[ 0 ])
            last[ 0 ]  =  arr[i];
  else
  {
            left  =   0 ;
            right  =  iCurrMaxLen;
   
   while  (left  !=  right  -   1 )
   {
                mid  =  (left  +  right)  /   2 ;
                (last[mid]  <=  arr[i])  ?  (left  =  mid) : (right  =  mid);
            }
   
            last[right]  =  arr[i];
        } // if
  
    } // for
 
 for  ( i  =   0 ; i  <  iCurrMaxLen  +   1 ; i ++ )
 {
        printf( " %d " , last[i]);
  if  (i  !=  iCurrMaxLen)
            printf( " /x20 " );
  else
            printf( " /n " );
    }
 
 if  (last)
 {
        delete [] last;
        last  =   0 ;
    }
 
 return  iCurrMaxLen  +   1 ;
}

int main()
{
 int arr[11]={1,2,3,1,2,4,3,7,9,8,10};
 GetLISLen(arr,11);
 getchar();
 return 0;
}

 

上述求解的最长递增序列不要求连续,下面给出求最长连续递增序列

template  < class  T >
int  FindLongestConIncSubseq( const  T  * arr,  int  n,  int   * pos)
{
 int  start  =   0 , end  =   1 ;
 int  iMaxLen  =   1 , iCurrLen  =   1 ;
 
 for  (end  =   1 ; end  <  n; end ++ )
 {
  if  (arr[end]  >=  arr[end  -   1 ])
  {
            iCurrLen ++ ;
        }
  else
  {
   if  (iCurrLen  >  iMaxLen)
   {
                iMaxLen  =  iCurrLen;
                start  =  end  -  iMaxLen;
            }
   
            iCurrLen  =   1 ;
        }
  
    } // for
 
 if  (iCurrLen  >  iMaxLen)
 {
        iMaxLen  =  iCurrLen;
        start  =  end  -  iMaxLen;
    }
 
 * pos  =  start;
 return  iMaxLen;
}

你可能感兴趣的:(程序员面试题精选(49):最长递增子序列)