原创 算法筆記(13)隨機選擇算法

例:求第k大的數 利用Partition操作隨機選擇一個數併產生劃分,判斷該數是不是第K大的數,如果偏小則在右邊繼續劃分,偏大則在左邊繼續劃分,直到找到第K大的數或者達到邊界爲止。 其中的Partition操作隨機選取一個數,這種

原创 算法筆記重點(12)two pointers

two pointers 利用問題本身特點以及序列的特性,使用兩個下標掃描從而快速解決問題。 two pointers可以同向也可以反向。例如求在一個沒有相同元素的序列中任取兩個元素和爲M的方式有多少種。這個時候如果直接遍歷,那麼

原创 算法筆記重點(10)區間貪心

區間不相交或者區間選點問題是一類典型的問題。方法也很固定,一種是按左端點從大到小排序,左端點相同按右端點從小到大排序,這樣每個區間的右端點小於上個選中區間的左端點即爲符合要求的區間。另一種則是右端點從小到大,同理。

原创 算法筆記重點(9)遞歸

將原問題劃分成若干個規模較小而結構與原問題相同或相似的子問題,然後分別解決這些子問題,最後合併子問題的解,得到原問題的解的方法,廣義上講稱爲分治。嚴格意義上,子問題數爲1的情況稱爲減治,大於1的情況稱爲分治。而分治既可以通過遞歸實

原创 算法筆記重點(11)二分

學會二分應當掌握三種模板,即尋找相等的值,尋找第一個大於等於的值以及尋找第一個大於的值,大於等於的值與大於的值可組成一個左閉右開的存在性區間,找到多個相同的值。另外,初值的選取需要看返回的值範圍。 浮點數二分也很重要,這裏需要設置

原创 算法筆記重點(15)分數

利用結構體存儲分數的分母和分子 分數的要求有三點:1.分母一定爲正數 2.當分數爲0時,分子爲0,分母爲1 3.分子與分母最大公約數爲1 分數化簡滿足這三點即可 分數的四則運算比較簡單,按照常規運算即可,另外除法需要注意除數的分子

原创 算法筆記重點(14)最大公約數與最小公倍數

以gcd(a,b)=gcd(b,a%b)爲遞歸式,gcd(a,0)=a爲遞歸邊界我們可以得到a,b的最大公約數。 最小公倍數即爲a*b/gcd(a,b)。 對於多個數的最小公倍數,可以用兩個數的最小公倍數和另一個數繼續求出最小公倍

原创 算法筆記重點(16)素數

素數的判斷比較簡單,判斷2到sqrt(n)即可。 素數篩取一般採用埃氏篩法。即默認全部爲素數(哈希),從2開始,使得素數的倍數被篩掉,最後沒有被篩掉的一定是素數。具體細節我在前面寫過。

原创 算法筆記重點(18)大整數運算

比較方便的方法是先建立一個結構體存儲大整數數組和它的長度。 四則運算一般只設計高精度加法,高精度減法,高精與低精的乘法與高精與低精的除法,具體代碼我之前有寫,這裏不贅述。 對於高精度數比較,首先比較長度,長度相等則從高位向低位依次

原创 算法筆記重點(17)質因子分解

質因子分解思路比較簡單,首先建立一個結構體存儲質因子以及其個數,由於十以內不同質因子乘積已經大於int範圍,所以只需建立一個10個int的數組。然後打印素數表,並且只需打印到sqrt(n)即可。然後判斷從2到sqrt(n)是否滿足

原创 算法筆記(8)哈希

在M個數中查找某個數是否出現過,或者在一篇文章中查找一個單詞是否出現過,又或者需要統計一篇文章中某個單詞出現的次數,最直接的思維就是依據這個單詞遍歷整篇文章。顯然,這種算法的時間複雜度隨着文章篇幅的增多時間逐漸增加,那麼如何寫出一

原创 算法筆記重點(7)sort排序

排序總會放在任何算法教材的首要部分,這裏不寫出選擇排序,插入排序,冒泡排序,歸併排序,快速排序等詳細代碼,我之前有寫過。而又由於C語言的qsort()函數對指針要求較高,所以着重分析C++的sort()函數應用。 對待基本數據類型

原创 算法筆記重點(6)進制轉換

這裏想到進制轉換是爲了之後的Hash學習做準備。 m進制轉換爲十進制 #include<cstdio> #include<cmath> int main() { int m,n,id=0; scanf("%d %

原创 算法筆記重點(1)浮點數的四捨五入

浮點數在以下幾種情況採用四捨五入 1.printf("%.mf",a); 2.cout<<fixed<<setprecision(m)<<a<<endl; 3.利用cmath的round()函數,對浮點數四捨五入取整 4.利用強制

原创 算法筆記重點(2)sscanf與sprintf的應用

曾經爲將整數或浮點數與字符串轉化而頭疼,現在有了很好的工具。 在此之前首先看看stringstream的用法,這個適用於string容器。 #include<iostream> #include<string> #include<