1. 程式人生 > >leetcode刷題經驗

leetcode刷題經驗

  1. 語言不是最重要的,思想最重要
  2. 從做上面的題,我發現我更擅長一些數學技巧不高的程式題,習慣靠直覺立馬書寫程式碼,而非嚴格推理之後,再書寫程式碼
  3. 對於連結串列的題比較擅長,連結串列可以在紙上畫畫,關鍵要考慮的問題,就是連結串列指標在運算中會改變,如何儲存需要儲存的連結串列指標值是難點,除了那題拷貝具有random指標的連結串列題,其他連結串列題我都比較快速的AC掉
  4. 對於樹的題,常見的方法有:BFS和遞迴(可以看作是DFS),整體來說,難度也不大,其中遞迴應該是最常用的,遞迴的方法需要注意的就是邊界判定;當然另一個問題,就是很多情況下,會被要求寫非遞迴的解法,比如說樹的遍歷,或者知先序中序構建樹,這些問題我得好好研究
  5. 對於求解題的BFS和DFS得到了比較大的鍛鍊,之前一直感覺模糊的掌握了DFS和BFS這兩種搜尋方法,事實上,直到現在才算是掌握的比較不錯,對於leetcode上面的很多題,如果不限時的話,我都能以DFS搞定(起碼能有20題以上),BFS往往在求解最先到達或者最短時間的時候用到,用起來感覺還不錯
  6. 對於DP還是不算很熟悉,除了LCS,LIS還有編輯距離這樣的經典DP題,其他我都很少往DP想,為什麼我總覺得DP有點難理解呢?
  7. 關於DP和BFS,DFS求解的選擇問題:一般來說,需要記錄解(由哪些組成)優先選擇BFS和DFS,它們在運算的時候能夠很好的儲存中間結果;對於DP,適合求解最終結果是怎麼的情況,比如求值(最長公共子序列),或者判斷是否存在(bool),DP如果要輸出最優路徑的話,是個比較麻煩的問題,一般還需要設定一個觀測DP在選擇表中如何移動的陣列,關於DP我要好好訓練下。
  8. 對STL熟悉了很多,用過很多之前都沒用過的容器,幾乎都用遍了吧:set,map,hash_set(unordered_set),hash_map(unordered_map),multimap,multiset(?好像這個我沒用過),vector,string,pair,stack,queue等等,以及algorithm的函式,比如sort, unique,這些STL提供的,真是極大的方便了生活,以前經常得自己寫一些基本資料結構,然而,自己寫的再好哪有STL的好用啊!
  9. 對於在電腦面前寫一些簡單的演算法程式應該是沒很大問題了,但接下來的問題是:1,手寫我要跪,雖然現在用vim,但我思路經常很跳,經常想起來就在前面插入,紙上可沒這條件;2,一些基本的演算法還不夠熟練,比如快排,堆排,歸併,KMP,等等,要立馬寫出一個bug free並且efficient&&elegant的程式碼是件不容易的時,我以後得專門在github上面建一個repo好好練習,自己寫給自己看
  10. leetcode上的大部分題都有不止一種解法,得好好看看其他人的解法,並且總結總結自己的解法 資料結構和演算法是計算機技術的基礎,有時候可以體會到美感。每一個 coder 都應該加強這方面的知識。
  11. 不要在乎題目本身,而是每個題目代表一定的背景知識,比如 dfs,剪枝,貪心和動態規劃。
     
  12. 競技和工程化寫程式碼畢竟還是不一樣的,思維方式不一樣,最開始做題很困難是正常的。

  13. 實在想不出來可以看看提示,因為如果缺乏理論知識,怎麼想也是想不出來的。