九、常用基礎(chǔ)算法

綠色:需要掌握了解;紅色:需要會(huì)寫會(huì)用或很重要。
本章節(jié)主要是寫一些基礎(chǔ)算法,一般運(yùn)用在模擬類型的題目。

圖形輸出
此類題目都是模擬輸出圖形,可以1)觀察其規(guī)律而后按行列循環(huán)輸出,或者2)空間換時(shí)間創(chuàng)建二維數(shù)組給值后輸出。一般情況下使用方法2)的代碼容易編寫,但空間復(fù)雜度略高(數(shù)據(jù)規(guī)模小時(shí)放心用)。
常見題型有:楊輝三角形及其變體、打印沙漏、矩陣輸入輸出等。

暴力枚舉(下稱爆破)
在章節(jié)三、C++11標(biāo)準(zhǔn)庫準(zhǔn)備知識(shí)中,有提及判斷算法是否會(huì)超時(shí)的辦法,即設(shè)計(jì)的算法執(zhí)行運(yùn)算的次數(shù)不能超過10^8。因此,當(dāng)判斷運(yùn)算次數(shù)不會(huì)超過10^8且沒有優(yōu)化的需求時(shí),大膽爆破。
例如:
①N是絕對(duì)值小于1e4的整數(shù)時(shí),設(shè)計(jì)的時(shí)間復(fù)雜度O(N2)的算法(10^8<=10^8);
②N是絕對(duì)值小于5e2的整數(shù)時(shí),設(shè)計(jì)的時(shí)間復(fù)雜度O(N3)的算法(1.25*10^8≈10^8,實(shí)際有點(diǎn)風(fēng)險(xiǎn))。
個(gè)別情況需要讀者酌情考慮是否使用暴力枚舉,在此不多贅述。

打表
打表是常見的空間換時(shí)間行為,即把已經(jīng)算過的值存起來便于下次使用,在遞歸的迭代寫法和動(dòng)態(tài)規(guī)劃算法中都可能運(yùn)用到。本質(zhì)是一種便于查詢使用和減少計(jì)算、降低總體時(shí)間復(fù)雜度的方法。例如分解2-N的質(zhì)因數(shù)時(shí),不需要對(duì)于每個(gè)N都從2~sqrt(N)循環(huán)分解,可以先計(jì)算出2到最大范圍的平方根的數(shù)的質(zhì)數(shù)表,便于計(jì)算。

進(jìn)制轉(zhuǎn)換
①十進(jìn)制轉(zhuǎn)為R進(jìn)制(除基數(shù)取余數(shù)法的do-while形式)
②R進(jìn)制轉(zhuǎn)十進(jìn)制
③R1進(jìn)制轉(zhuǎn)R2進(jìn)制(R1進(jìn)制轉(zhuǎn)十進(jìn)制,再十進(jìn)制轉(zhuǎn)R2進(jìn)制即可,代碼就上面?zhèn)z函數(shù)擱一起)
注:若轉(zhuǎn)換得到的數(shù)的位數(shù)超過最大整型類型long long能容納的范圍,即大數(shù)轉(zhuǎn)換(本質(zhì)是大數(shù)的乘除法算法)。

二分查找
1.標(biāo)準(zhǔn)庫的二分查找函數(shù):lower_bound、upper_bound、equal_range、binary_search。
2.自己實(shí)現(xiàn)binary_search(升序序列查找x的位置):
lower_bound(非遞減序列查找第一個(gè)大于等于x的位置)實(shí)現(xiàn):
??