求一個數組中遞增不減最長子數組

/************本模塊功能如下************/
 
/*現在有一個數組 我們可以定義數組的子數組

如 數組 1 3 4 2 5 8 7
它的子數組可以是  1 3 4      3 4 2 5 等等

請寫一個算法  找一個子數組  這個子數組遞增不減少 並且是滿足遞增不減的最長子數組
*/


#include <stdio.h>
#include <stdlib.h>

int main()
{
 int n,i,k=0,len=1;
 int maxlen=1;    //保存最大遞增不減子數組長度
 int first=0;     //保存遞增不減子數組的首元素下標
 int low=0;       //保存最大遞增不減子數組的首元素下標
 int *array;
 printf("請輸入數組元素的個數:");
 scanf("%d\n",&n);
 if(n<=0)
 {
  printf("數組長度必須爲正整數,請再次輸入:");
  printf("請輸入數組元素的個數:");
     scanf("%d\n",&n);
 }
 array=(int *)malloc(sizeof(int)*n);
 for(i=0;i<n;i++)
 {
  scanf("%d",&array[i]);
 }
// for(i=0;i<n;i++)
// {
//   printf("%d ",array[i]);
// }
 printf("\n");
    while(k<n)
 {  
  if(array[k+1]<array[k])
  {
   k++;
   len=1;
   continue;
  }
  while(array[k+1]>=array[k])
  {  
   if(len==1)
   {
    first=k;
   }
   len++;
   k++;
  }
  if(maxlen<len)
  {
   maxlen=len;
   low=first;
  }
 }
 printf("只増不減最長子數組長度是%d\n",maxlen);
 printf("只増不減最長子數組是:");
 for(i=low;i<low+maxlen;i++)
  printf("%d ",array[i]);
 printf("\n");
}

但是這個算法的時間複雜度是O(n*n),用動態規劃的思想只需O(n)的時間複雜度!代碼繼續學習中。。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章