如何使用「番茄法」高效的写算法题?
戳藍字“CSDN云計算”關注我們哦!??
作者:侯振宇
轉自:五分鐘學算法
01 目的?
持續做算法題的目的仍然是自身能力提升。可以繼續細化成三點:
保持思維敏捷。非常重要,狀態好才能保持對編程的熱情。
對基礎的數據結構、查找和排序保持熟練。能解決日常開發中的性能相關問題。
積累對問題域的探索。只有對問題域有足夠的探索,才可能舉一反三,迸發靈感。
02 方法?
為了更有效地實現上面的目標。推薦用下面的方式來做題:
嚴格使用番茄時鐘進行規劃
在刷題的過程中非常最容易產生挫敗感,無法堅持。原因是,長時間的思考導致疲倦,多次積累的疲倦使得自己產生了 抵觸記憶。以至于會下意識覺得做題就是 刻苦。
推薦大家在開始之前看看《意志力》。里面指出 喜好 是會被記憶操控的,如果每次做一件事最后留下的映像都是輕松愉快的,那么人就會越來越喜歡做此事,反之厭惡。所以為了能保持做題的興趣,務必每次要主動給自己留下好的記憶。
番茄時鐘能夠很好地保障不會出現 長時間 的思考,同時也能保障不容易 疲倦。如果你已經能很熟練的使用番茄時鐘,請跳過。如果你對番茄時鐘的印象仍然只是20分鐘休息一次。那么請繼續閱讀。
番茄時鐘有兩個重點,一是通過長期的訓練,讓大腦習慣在一段時間內保持高效。二是通過要求每次在開始前有規劃和每次結束后有總結,保障產出。當把這兩點應用到做算法的過程中時,應該采取以下的方式:
用一個番茄時鐘對題目進行徹底的分析
目前 LeetCode 上的題大致可分為兩種類型:
對某種復雜規則的徹底解析,很有可能要構造狀態機,充分考慮邊界情況。
對某種數據結構及算法的應用。
對數學概念、遍歷、動態規劃等的綜合應用。
在這個分析過程中首先要大致判斷出屬于哪一類。
在掌握了基本的數據結構和算法后,應該能很好的判斷是不是屬于前兩類。
如果判斷不出說明需要回頭先重新復習基本數據結構。
推薦《算法》一書。
不要強行刷題。算法書的每種數據結構及算法的大概思路、解決的問題以及相應的時間和空間復雜度了解之后可以再回來。
第一種情況
例子:LeetCode 第 65 號問題 --- 有效數字
這個番茄時鐘內的目標是:
理清題目背后解法要用的技術
充分收集可能涉及到的邊界
完成后應該有的總結是:
是否理清了要用的技術
是否有不確定的地方
收集到的邊界是否能覆蓋所有情況
如果發現在要用的技術中有不熟悉的地方,應該立即中斷,開啟另一個番茄時鐘進行學習。切忌盲目嘗試。
當發現有不確定的地方時,重新開啟一個番茄時鐘,按照當前思路把不確定地方當成一個單獨的算法問題進行解決。
第二種情況
例子:?LeetCode 第 493 號問題 --- 翻轉對
這一類題目通常采取遍歷的方法一定都能找到解法。重點是找到最優解,因此需要提前有足夠的數據結構的知識。
數據結構可大致分為鏈(數組、棧、隊列)、樹、圖。在這三類數據中要分別掌握排序和查找算法。特別是相應的時間復雜度。
這類題目很好判斷,通常題目中會描述了幾個數據或者狀態的關聯的關系,然后需要你找出符合條件的某些數據。那么將題目中的關聯關系轉換成相應的數據結構,再使用對應算法就夠了。要對數據結構的足夠熟悉,才能知道如何轉化。
這種情況下番茄時鐘的目標是:
將問題轉化為對相應數據結構的問題。
總結是:
需不需要分情況討論,需要一種數據結構還是多種
相應數據結構是否能完全覆蓋題目問題中的所有情況
第三種情況
例子:LeetCode 第 76 號問題 --- 最小覆蓋子串
這一類情況最好用排除法,發現不是第一種或者第二種,那么再往這種情況下考慮。這類題的特點是通常是發散性質,剛看到題目容易有思路,但不太容易找到最優解。這種情況下,也要先判斷題目子類型。
如果發現題目能從遍歷的角度解決問題,那么可以往遍歷的優化上去想。例如是否在遍歷的時候能夠排除掉一些情況。或者通過排序等手段之后,能實現遍歷時排除某些情況。
如果發現題目中存在多種約束關系,然后求某個值,那么可以往數學方程組上去想。
如果發現問題可以被遞歸解決,并且能夠將遞歸方式轉化成順序方式,可以往動態規劃上去想。
在這種情況下,番茄時鐘的目標:
判斷出題目類型。
總結:
是否有其他類型更適合。
是否需要多種手段結合。
執行時的番茄時鐘
當分析完之后,建議不要開始寫代碼,一定要休息片刻。執行階段是對我們平時寫代碼狀態的一種鍛煉,應該非常珍惜。如果一個番茄時鐘執行不完,應該拆分成多個。在這段時間中,設定的番茄時鐘目標應該是:
高效地驗證分析階段的思路
要實現執行高效,最重要的是養成良好的編碼習慣,不要犯小錯誤。要始終朝著只要想清楚了,一次寫好,不要調試的狀態要求自己。這里常見的小錯誤有:
拼寫錯誤。變量命名要足夠清楚,不要用單個字母或者語意不明的單詞。
數組邊界未考慮。
空值未考慮。
用 Math.ceil 之類函數時未考慮清楚上下界。
調試超過寫代碼時間 30% 時說明狀態非常有問題。在這個階段的總結是:
是否完成了對分析的驗證
編碼過程是否足夠高效
如果中間發現了分析階段的錯誤或者疏漏,應該立即結束編碼,休息。并且重新開啟分析階段的時鐘。
切忌邊寫邊改方案。
如果發現編碼過程狀態不夠好,應該加長休息時間,或者干脆結束掉。不要給自己留下低效的映像。
將任務留到第二天其實也可以檢驗自己第一天的思路是否足夠系統化,如果是,那么第二天應該能很快的重新找回思路。
任一番茄時鐘結束時
一定要做好總結,特別是當沒有解出題來,沒有思路的時候,一定要通過結束階段的總結來反思犯了什么錯誤。解出來了也一定要總結題目的特點,題目中哪些要素是解出該題的關鍵。不做總結的話,花掉的時間所得到的收獲通常只有 50% 左右。
在題目完成后,要特別注意總結此題最后是歸納到哪種類型中,它在這種類型中的獨特之處是什么。經過總結,這樣題目才會變成你在此問題域中的積累。
做好總結,讓每道題都有最大的收獲。一個月之后自己的狀態應該會有很大變化。
03 如何分享?
在這個倉庫中進行解題分享時,建議大家就把自己番茄時鐘的執行記錄進行分享。最后標準的解法以及思路其實在 discussion 中都有。對他人有用的分享不是結果,而是:
你在番茄時鐘中是如何規劃的,也就是番茄時鐘的目標。
你是如何分析,也就是思路。
你的結論是什么,或者是你在執行時除了什么問題。
你所總結出的題目的關鍵部分。也就是對問題域進行探索的經驗。
5?月?26?日-?5?月?27?日,第一屆?CTA?核心技術及應用峰會將空降杭州國際博覽中心。
目前雙日會議預售票發售最后?2?天,僅售?799?元(原票價1099元)。點擊閱讀原文,立享預售優惠。
了解大會詳情,請添加票務小助手微信:15101014297,備注「CTA」。
福利
掃描添加小編微信,備注“姓名+公司職位”,加入【云計算學習交流群】,和志同道合的朋友們共同打卡學習!
推薦閱讀:
騰訊面試:一條SQL語句執行得很慢的原因有哪些?
程序員專屬小情話,哎呦,不錯哦!| 程序員有話說
普通家庭走出信息學才子,抱病參賽奪世界信奧亞軍 | 人物志
Rust今天4歲啦, 為什么越來越多的知名項目用Rust來開發?
商湯“變法”:推中小學AI教材,mini自駕車,要打造AI時代的「清明上河圖」
轉行AI成為技術大牛,你需要理解這兩項技術!
真香,朕在看了!
總結
以上是生活随笔為你收集整理的如何使用「番茄法」高效的写算法题?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: boost::core模块实现交换pri
- 下一篇: win7新装硬盘怎么设置 win7硬盘新