演算法找陣列中的特定元素

dongyu2013發表於2014-05-17

一個 int 陣列,裡面資料無任何限制,要求求出所有這樣的數 a[i],
其左邊的數都小於等於它,右邊的數都大於等於它。
能否只用一個額外陣列和少量其它空間實現。

思路:如果能用兩個輔助陣列,那麼相對來說簡單一點,可定義陣列Min和陣列Max,其中Min[i]表示自a[i]之後的最小值(包括a[i]),Max[i]表示自a[i]之前元素的最大值。有了這兩個輔助陣列後,對於a[i],如果它大於Max[i-1]並且小於Min[i+1],那麼就符合要求。

      但是題目要求是隻用一個額外陣列,其實Max陣列可以省去,完全可以邊判斷邊計算,這是因為Max[i]是自左往右計算的,而判斷時也是自左往右,兩個過程正好可以合起來。只需用一個變數Max儲存一下當前的最大值即可。下面給出兩種方法的程式碼實現。

      參考程式碼:

  1. //函式功能 : 找元素  
  2. //函式引數 : pArray指向陣列,len為陣列的元素個數  
  3. //返回值 : 無  
  4. void FindElements_Solution1(int *pArray, int len)  
  5. {  
  6.     if(pArray == NULL || len <= 0 )  
  7.         return ;  
  8.   
  9.     int *pMin = new int[len];  
  10.     int *pMax = new int[len];  
  11.     int i;  
  12.   
  13.     pMax[0] = pArray[0];  
  14.     for(i = 1; i //計算自i往前最大值的輔助陣列  
  15.         pMax[i] = (pMax[i-1] >= pArray[i])? pMax[i-1]: pArray[i];  
  16.     pMin[len-1] = pArray[len-1];  
  17.     for(i = len - 2; i >= 0; i--) //計算自i開始最小值的輔助陣列  
  18.         pMin[i] = (pMin[i+1] <= pArray[i])? pMin[i+1]: pArray[i];  
  19.   
  20.     if(pArray[0] <= pMin[0])     //檢查第1個元素是否滿足條件  
  21.         cout<' ';  
  22.     for(i = 1; i 
  23.     {  
  24.         if(pArray[i] >= pMax[i-1] && pArray[i] <=pMin[i+1]) //滿足這個關係式的元素符合要求  
  25.             cout<' ';  
  26.     }  
  27.     if(pArray[len-1] >= pMax[len-1]) //檢查第len個元素是否滿足條件  
  28.         cout<
  29.     cout<
  30.   
  31.     delete [] pMin;  
  32.     delete [] pMax;  
  33.     pMin = pMax = NULL;  
  34. }  

相關文章