C語言找出數(shù)組中的特定元素的算法解析
問題描述:一個(gè)int數(shù)組,里面數(shù)據(jù)無任何限制,要求求出所有這樣的數(shù)a[i],其左邊的數(shù)都小于等于它,右邊的數(shù)都大于等于它。能否只用一個(gè)額外數(shù)組和少量其它空間實(shí)現(xiàn)。
思路:如果能用兩個(gè)輔助數(shù)組,那么相對(duì)來說簡單一點(diǎn),可定義數(shù)組Min和數(shù)組Max,其中Min[i]表示自a[i]之后的最小值(包括a[i]),Max[i]表示自a[i]之前元素的最大值。有了這兩個(gè)輔助數(shù)組后,對(duì)于a[i],如果它大于Max[i-1]并且小于Min[i+1],那么就符合要求。
但是題目要求是只用一個(gè)額外數(shù)組,其實(shí)Max數(shù)組可以省去,完全可以邊判斷邊計(jì)算,這是因?yàn)镸ax[i]是自左往右計(jì)算的,而判斷時(shí)也是自左往右,兩個(gè)過程正好可以合起來。只需用一個(gè)變量Max保存一下當(dāng)前的最大值即可。下面給出兩種方法的代碼實(shí)現(xiàn)。
參考代碼:
//函數(shù)功能 : 找元素 //函數(shù)參數(shù) : pArray指向數(shù)組,len為數(shù)組的元素個(gè)數(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個(gè)元素是否滿足條件 cout<<pArray[0]<<' '; for(i = 1; i < len - 1; i++) { if(pArray[i] >= pMax[i-1] && pArray[i] <=pMin[i+1]) //滿足這個(gè)關(guān)系式的元素符合要求 cout<<pArray[i]<<' '; } if(pArray[len-1] >= pMax[len-1]) //檢查第len個(gè)元素是否滿足條件 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個(gè)元素是否滿足條件 cout<<pArray[0]<<' '; for(i = 1; i < len - 1; i++) { if(pArray[i] >= Max && pArray[i] <=pMin[i+1]) //滿足這個(gè)關(guān)系式的元素符合要求 cout<<pArray[i]<<' '; Max = (Max < pArray[i])? pArray[i]: Max; //更新當(dāng)前最大值 } if(pArray[len-1] >= Max) //檢查第len個(gè)元素是否滿足條件 cout<<pArray[i]; cout<<endl; delete [] pMin; pMin = NULL; }
找出數(shù)組中兩個(gè)只出現(xiàn)一次的數(shù)字(數(shù)組)
問題描述:一個(gè)整型數(shù)組里除了兩個(gè)數(shù)字之外,其他的數(shù)字都出現(xiàn)了兩次。請(qǐng)寫程序找出這兩個(gè)只出現(xiàn)一次的數(shù)字。要求時(shí)間復(fù)雜度是O(n),空間復(fù)雜度是O(1)。
思路:如果只有一個(gè)數(shù)字只出現(xiàn)一次,而其他都出現(xiàn)兩次,則直接將所有數(shù)字做一次異或運(yùn)算即可,因?yàn)橄嗟鹊臄?shù)字異或一下結(jié)果為0。如果有兩個(gè)數(shù)字只出現(xiàn)一次,而其他數(shù)字出現(xiàn)了兩次。該怎么辦呢?《編程之美》一書提供了一種方法,即先將所有數(shù)字做一次異或運(yùn)算,得到一個(gè)數(shù)字,然后以該數(shù)字的某非0位作為過濾位,將數(shù)組分成兩個(gè)部分,此時(shí)只出現(xiàn)一次的數(shù)字會(huì)被分到不同的部分?,F(xiàn)在問題就轉(zhuǎn)為只出現(xiàn)一次的情況,對(duì)每部分分別做異或運(yùn)算即可。
參考代碼:
//函數(shù)功能 : 找出數(shù)組中兩個(gè)只出現(xiàn)一次的數(shù)字 //函數(shù)參數(shù) : arr為源數(shù)組,len為數(shù)組元素個(gè)數(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]; } }
上一篇:C++設(shè)計(jì)模式編程中簡單工廠與工廠方法模式的實(shí)例對(duì)比
欄 目:C語言
下一篇:解析C++函數(shù)的默認(rèn)參數(shù)和占位參數(shù)及較之C語言的拓展
本文標(biāo)題:C語言找出數(shù)組中的特定元素的算法解析
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2423.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子