• 最长增长子序列


    O(N^2)算法
    
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<memory.h>
    #include "assert.h"
    
    void Longest(int *arr ,int len )
    {
        int *pArrPre = ( int*)malloc( len* sizeof( int));
        int *pArrLen = ( int*)malloc( len* sizeof( int));
     
        int maxLen = 1; int maxIndex = 1; 
        for(int iLoopTarget = 0;iLoopTarget< len;iLoopTarget++){
          pArrLen[iLoopTarget] = 1;
          pArrPre[iLoopTarget] = -1;
          for(int iLoop = 0;iLoop < iLoopTarget;iLoop++){
            if( arr[iLoopTarget]> arr[iLoop] && pArrLen[iLoop]+1>pArrLen[iLoopTarget]){
              pArrLen[iLoopTarget] = pArrLen[iLoop] + 1;
              pArrPre[iLoopTarget] = iLoop;
            }
          }
        
          if(pArrLen[iLoopTarget]>maxLen){
            maxLen = pArrLen[iLoopTarget];
            maxIndex = iLoopTarget;
          }
        }
    
        while(maxIndex>=0){
          printf("%3d ", arr[maxIndex]);
          maxIndex = pArrPre[maxIndex];
        }
        free(pArrPre);free(pArrLen);
    }
    
    int main()
    {
        int arr[] = {3,4,5,3,9,5,6,8,9,0,3,4,6,3,6,4,6,3,5,7,8,2};
        Longest(arr,sizeof(arr)/sizeof(arr[0]));
        return 1;
    }
    
    
    
    
    
    O(NlgN)算法
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<memory.h>
    #include "assert.h"
    
    void print(int *arr,int len);
    
    void Longest(int *arr ,int iLen )
    {
        int *pArrPre = ( int*)malloc( iLen* sizeof( int)); //存储前一个数字的索引,通过这个ArrPre获取增长子序列
        int *pArrSort = ( int*)malloc(( iLen+1)* sizeof( int)); //排序的数值
        int *pArrSortIndex = ( int*)malloc(( iLen+1)* sizeof( int)); //排序数值所对应的index,为pArrPre服务
       
        pArrSort[0] = -10000; //INT_MIN
        pArrSortIndex[0] = -1;
        int maxIndexSort = 0;
       
        for (int iLoopTarget = 0; iLoopTarget <= iLen; iLoopTarget++) {
            pArrPre[iLoopTarget] = -1;
           
            for( int iLoop = maxIndexSort; iLoop >= 0; iLoop--) { //用二分法查找,就可以做到NlogN的时间复杂度了
                if(pArrSort[iLoop]< arr[iLoopTarget]){
                    pArrSort[iLoop+1] = arr[iLoopTarget];
                    pArrSortIndex[iLoop+1] = iLoopTarget;
                    pArrPre[iLoopTarget] = pArrSortIndex[iLoop];
                    if(iLoop+1>maxIndexSort)
                        maxIndexSort = iLoop+1;
                    break;
                }
            }
           
        }
    
        //Print All Log Data
        print(arr,iLen);
        print(pArrPre,iLen);
        print(pArrSort,iLen);
        print(pArrSortIndex, iLen);
    
        int idxMax = pArrSortIndex[maxIndexSort];
    
        while (idxMax>=0) {
            printf( "%d ",arr [idxMax]);
            idxMax = pArrPre[idxMax];
        }
       
       
    
        free(pArrPre);
        free(pArrSortIndex);
        free(pArrSort);
    }
    
    void print(int *arr ,int len )
    {
        int iLoop;
        for(iLoop = 0;iLoop < len;iLoop++)
        {
            printf( "%3d ",arr [iLoop]);
        }
        printf("
    ");
    }
    int main()
    {
        int arr[] = {3,4,5,3,9,5,6,8,9,0,3,4,6,3,6,4,6,3,5,7,8,2};
        Longest(arr,sizeof(arr)/sizeof(arr[0])-1);
        return 1;
    }
    

      

  • 相关阅读:
    最小生成数kruskal算法和prim算法
    图的表示及遍历
    mysql忘记root用户密码重置密码的方式
    dwr2.0版本的demo
    web.xml中不同版本的servlet头以及版本控制
    初学jboss
    Filter学习总结,顺便提及点servlet3.0异步filter和异步监听
    监听器
    问题发现和解决
    linux学习
  • 原文地址:https://www.cnblogs.com/dongfangchun/p/7200682.html
Copyright © 2020-2023  润新知