LeetCode總結之一

最近在陸陸續續的練習LeetCode,將自己以前的只是總綜合鞏固一下,也爲了以後面試準備。儘量從自己的所思所想出發,鄙人菜鳥,還請勿噴。整個練習過程中採用C++。
1、我練習主要遵從一下幾個習慣:from easy to hard . similar problems . Tags.
2、由於是第一次練習OJ,很多東西都不熟,所以多參考了別人的思路,然後自己再實現以便,有人說盡量自己思考,我覺得每個人都有自己的方法吧,一開始學習時,什麼都自己去思考是一件很痛苦的事情,不過我有個原則:遇到事情首先要想,它考什麼,該如何做,要注意什麼,有沒有類似的;有些覺得就是有一兩點想不到的,就參考別人的,反正後面我還會再練一遍的;幾遍讀下來,一點都沒感的,就直接pass,可能今天天氣不太好吧。
3、記錄一些自己當時的想法,古語有云,好記性不如爛筆頭。每次看到別人寫的一大堆的技術性文章都好崇拜,好激動,我比較懶,很少寫,當然也只是爲了記錄記錄學習過程了,順便整理一下資料。

下面正式開始:
關於LeetCode是什麼我就不介紹了,請自行百度或腦補。
LeetCode中主要分爲這幾大類:Array、Hash Table、Linked List、Math、Two Pointers、Divide and Conquer、String、Binary Search、Dynamic Programming、Backtracking、Stack、Heap、Greedy、Bit Manipulation、Tree、Sort、BFS、DFS、Union Find、Graph、Design、Recursion、Trie、Binary Indexed Tree、Brainteaser、Memoization、Topological Sort等。有的題目是這幾個點的綜合,有的可以有多種解題思路。
接下來sunny將依次爲你解讀這些tag。
Array
c++中的array主要用vector來實現,具有長度可變,可整體拷貝等優點。在進行練習之前,請先熟悉一下基本的操作。
其中有一個題目要array rotate。例如給定數組[1 2 3 4 5 6 7],進過k(3) step後爲[5 6 7 1 2 3 4],這個題目主要就是要找出rotate的數學關係即原先下標爲i的元素,經過變化後所在的序號應該爲:(i+k)%n。這類題目找個例子來試一試就知道了,類似的還有single list rotate 。重要的點就是將其先變爲循環鏈表。找出數學關係在dynamic programming中也應用的較多。
另外一個容易和array結合的就是two pointer了,由於array經常需要做的就是元素之間的移動了,刪除呀、合併呀、移動呀,這些都需要用到。典型的有如remove element、move zeros、remove duplicate from sorted array.這類只要想到了都比較簡單。
接下來就是藉助數學知識,用array去實現的比如 Pascal’s Triangle,有點像動態規劃,用iterator or recursive求解最重要的還是找到前後之間的關係規律,對於一些空間、時間有特殊要求的,就要精心安排,多練習,多總結了。後面有時間會一一點出。
最後,我想點一下和Hash Table的結合,其中用的最多的映射即是元素和出現次數之間的映射element<–>count 。有如 single number , contains duplicate。常用的一種思想是元素做鍵,元素的下標做值。
好了,下次就開始list的介紹了。

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