国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言找出數(shù)組中的特定元素的算法解析

2020-01-26 14:40:32
字體:
供稿:網(wǎng)友

     問題描述:一個int數(shù)組,里面數(shù)據(jù)無任何限制,要求求出所有這樣的數(shù)a[i],其左邊的數(shù)都小于等于它,右邊的數(shù)都大于等于它。能否只用一個額外數(shù)組和少量其它空間實(shí)現(xiàn)。
      思路:如果能用兩個輔助數(shù)組,那么相對來說簡單一點(diǎn),可定義數(shù)組Min和數(shù)組Max,其中Min[i]表示自a[i]之后的最小值(包括a[i]),Max[i]表示自a[i]之前元素的最大值。有了這兩個輔助數(shù)組后,對于a[i],如果它大于Max[i-1]并且小于Min[i+1],那么就符合要求。
      但是題目要求是只用一個額外數(shù)組,其實(shí)Max數(shù)組可以省去,完全可以邊判斷邊計(jì)算,這是因?yàn)镸ax[i]是自左往右計(jì)算的,而判斷時(shí)也是自左往右,兩個過程正好可以合起來。只需用一個變量Max保存一下當(dāng)前的最大值即可。下面給出兩種方法的代碼實(shí)現(xiàn)。
      參考代碼:

//函數(shù)功能 : 找元素 //函數(shù)參數(shù) : pArray指向數(shù)組,len為數(shù)組的元素個數(shù) //返回值 : 無 void FindElements_Solution1(int *pArray, int len) {   if(pArray == NULL || len <= 0 )     return ;    int *pMin = new int[len];   int *pMax = new int[len];   int i;    pMax[0] = pArray[0];   for(i = 1; i < len; i++)    //計(jì)算自i往前最大值的輔助數(shù)組     pMax[i] = (pMax[i-1] >= pArray[i])? pMax[i-1]: pArray[i];   pMin[len-1] = pArray[len-1];   for(i = len - 2; i >= 0; i--) //計(jì)算自i開始最小值的輔助數(shù)組     pMin[i] = (pMin[i+1] <= pArray[i])? pMin[i+1]: pArray[i];    if(pArray[0] <= pMin[0])   //檢查第1個元素是否滿足條件     cout<<pArray[0]<<' ';   for(i = 1; i < len - 1; i++)   {     if(pArray[i] >= pMax[i-1] && pArray[i] <=pMin[i+1]) //滿足這個關(guān)系式的元素符合要求       cout<<pArray[i]<<' ';   }   if(pArray[len-1] >= pMax[len-1]) //檢查第len個元素是否滿足條件     cout<<pArray[i];   cout<<endl;    delete [] pMin;   delete [] pMax;   pMin = pMax = NULL; } 
void FindElements_Solution2(int *pArray, int len) {   if(pArray == NULL || len <= 0 )     return ;    int *pMin = new int[len];   int Max;   int i;    Max = pArray[0];   pMin[len-1] = pArray[len-1];   for(i = len - 2; i >= 0; i--) //計(jì)算自i開始最小值的輔助數(shù)組     pMin[i] = (pMin[i+1] <= pArray[i])? pMin[i+1]: pArray[i];    if(pArray[0] <= pMin[0])   //檢查第1個元素是否滿足條件     cout<<pArray[0]<<' ';    for(i = 1; i < len - 1; i++)   {     if(pArray[i] >= Max && pArray[i] <=pMin[i+1]) //滿足這個關(guān)系式的元素符合要求       cout<<pArray[i]<<' ';     Max = (Max < pArray[i])? pArray[i]: Max; //更新當(dāng)前最大值   }   if(pArray[len-1] >= Max) //檢查第len個元素是否滿足條件     cout<<pArray[i];   cout<<endl;    delete [] pMin;   pMin = NULL; } 

找出數(shù)組中兩個只出現(xiàn)一次的數(shù)字(數(shù)組)
 問題描述:一個整型數(shù)組里除了兩個數(shù)字之外,其他的數(shù)字都出現(xiàn)了兩次。請寫程序找出這兩個只出現(xiàn)一次的數(shù)字。要求時(shí)間復(fù)雜度是O(n),空間復(fù)雜度是O(1)。
     思路:如果只有一個數(shù)字只出現(xiàn)一次,而其他都出現(xiàn)兩次,則直接將所有數(shù)字做一次異或運(yùn)算即可,因?yàn)橄嗟鹊臄?shù)字異或一下結(jié)果為0。如果有兩個數(shù)字只出現(xiàn)一次,而其他數(shù)字出現(xiàn)了兩次。該怎么辦呢?《編程之美》一書提供了一種方法,即先將所有數(shù)字做一次異或運(yùn)算,得到一個數(shù)字,然后以該數(shù)字的某非0位作為過濾位,將數(shù)組分成兩個部分,此時(shí)只出現(xiàn)一次的數(shù)字會被分到不同的部分。現(xiàn)在問題就轉(zhuǎn)為只出現(xiàn)一次的情況,對每部分分別做異或運(yùn)算即可。
     參考代碼:

//函數(shù)功能 : 找出數(shù)組中兩個只出現(xiàn)一次的數(shù)字 //函數(shù)參數(shù) : arr為源數(shù)組,len為數(shù)組元素個數(shù),result用來存放結(jié)果  //返回值 :  無 void FindIsolateTwo(int *arr, int len, int *result) {   int i, all = 0, flag = 1;    for(i = 0; i < len ; i++) //所有數(shù)異或     all ^= arr[i];    while(!(all&flag)) //尋找過濾位     flag <<= 1;    result[0] = result[1] = 0;   for(i = 0; i < len; i++) //利用過濾位區(qū)分   {     if(flag&arr[i])       result[0] ^= arr[i];     else       result[1] ^= arr[i];   } } 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 岳西县| 井冈山市| 涟水县| 北川| 文昌市| 金门县| 师宗县| 嘉祥县| 罗定市| 新巴尔虎左旗| 稷山县| 黄梅县| 天祝| 莲花县| 东兰县| 彭山县| 达尔| 内黄县| 德化县| 视频| 嘉祥县| 水城县| 南通市| 德安县| 竹溪县| 台东市| 余江县| 汶上县| 红安县| 开封县| 云安县| 无棣县| 奉节县| 南岸区| 佛冈县| 萍乡市| 永城市| 栾城县| 衡山县| 年辖:市辖区| 怀远县|