00.類型問題解決方案.md

分治問題:

分治是指divide and conquer,將大問題分解爲小問題 ,最終再merge。所以在編程的時候分爲遞歸操作和merge過程,而遞歸操作其實是很簡單的,例如歸併排序的時候排序時只需要執行幾段遞歸就可以。merge過程就會稍微有些繁瑣,也是分治的編程難點。具體的可以使用歸併排序中的一個help數組加上三個while那種結構,很實用。

子數組問題:

數組中最長子序列啊,子數組問題,大多數都可以用“必須以第i個位置結尾,會怎麼怎麼樣,能不能推出i+1”,就類似於01中最長遞增子序列的問題。

子數組就是數組的子集,但是要求必須是連續的。

雙指針問題:

左右指針不管是兩個指針一起從左往右(未排序的正數數組中累加和爲。。。)還是左右分別走(存水),都會有一個指標,這個指標會引導指針動作的方向。

感染問題:

比如要把圖中某一節點怎麼怎麼樣,同時把與他發生關係的其它節點也怎麼怎麼樣,用遞歸。看下面的島問題吧。

雙隊列問題:

如果有一組數,先出現的數會對後出現的數有影響,可以考慮使用雙隊列的方法,包括左神的貓狗隊列問題(彈出第一個貓或第一個狗)和下面的DOTA2問題。

中位數問題:

先處理偶數個數的中位數和奇數個數的中位數。有的時候偶數個數的中位數是中間兩個數的平均數,奇數個數就是中間的。

int n=a.size();
int Median = (a[(n-1)/2] + a[n/2])/2;

如果是偶數,分別是前面和後面的平均數,如果是奇數,兩個數相等。((n-1)/2和(n/2)都是下標,如果要找第幾小的數要加一變成()(n-1)/2+1)和(n/2+1))。

中位數其實就是大小爲第n/2大的數。這句話表面上是廢話,但是有用。例如在求兩個排序好的數組合並之後的中位數時,如果要求log(m+n)的複雜度,就要用到這種思想了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章