黑马程序员技术交流社区

标题: 获得最长单调递增子串的一种解法,很经典!! [打印本页]

作者: Lin0411    时间: 2014-5-2 16:27
标题: 获得最长单调递增子串的一种解法,很经典!!
  1. 获得一个整形数组中的最长单调递增子串,并将其打印出来。
  2. 假设源数据数组为arr,长度为n,用数组mem[n]来记录以0=<i<n下表为结尾元素的递增子串的个数,path[][]来记录以0=<i<n为下表元素的递增子串的各数据值。
  3. 根据算法    mem0]=1, mem[i] = max{mem[k]}+1 (其中   0=<k<i,arr[k]<arr[i] )


  4. public class GetMaxSubInt
  5. {
  6.         public static void main(String[] args)
  7.         {
  8.                 int[] a = {1,4,3,6,5,9};
  9.                 MaxSubOrder(a);
  10.         }
  11.        
  12.         public static void MaxSubOrder(int[] arr)
  13.         {
  14.                 int n = arr.length;                      //数据个数
  15.                 int[] mem = new int[n];                  //急速每个递增子串的数据个数
  16.                 int[][] path = new int[n][n+1];         //记录最长子串的值,其中path[i][n]用来记录以i未下表元素结尾的递增子串的数据个数
  17.                 int i=0,j=0,k=0;               
  18.                 int count = 0;                                //计数器
  19.                 for(i=0,mem[0]=1; i<n; i++)
  20.                 {
  21.                         path[i] = new int[n+1];
  22.                         count = 0;
  23.                         for(j=0,k=0; j<i; j++)
  24.                         {
  25.                                 if((arr[j]<=arr[i]) && (k<mem[j]))    // 满足  0=<j<i arr[j]<arr[i] && 获得mem[i]
  26.                                 {
  27.                                         k = mem[j];
  28.                                         path[i][count++] = arr[j];
  29.                                 }
  30.                         }
  31.                         mem[i] = k+1;
  32.                         path[i][count++] = arr[i];
  33.                         path[i][n] = count;
  34.                        
  35.                 }
  36.                
  37.                 //获取mem[]中的最大值,即为最长递增子串值

  38.                 for(i=0,k=0; i<mem.length; i++)
  39.                 {
  40.                         if(mem[i] > k)
  41.                         {
  42.                                 k = mem[i];
  43.                                 j = i;
  44.                         }
  45.                 }
  46.                
  47.                 //输出最长递增子串
  48.                 for(i=0; i<path[j][n]; i++)
  49.                 {
  50.                         System.out.print(path[j][i]+"  ");
  51.                 }
  52.         }
  53. }

  54. 算法所用时间为O(n*n)。
复制代码

作者: 许庭洲    时间: 2014-5-6 10:18
值得学习ing!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2