[內化筆記]LeetCode刷題心得體悟簡記與簡易方法論紀錄

Spyua
spyua
Published in
Sep 15, 2024

近期刷題,做了一些簡易整理。稍微記錄一下對刷題的認知。這篇文章記錄了我在刷 LeetCode 題目時的思考過程,並簡易示範對於如何利用刷題來提升解題能力的觀察。但這不是一篇系統化的方法論整理,而是更多地關注於思維成長的點滴。如果你想快速學到技術上的訣竅,建議可以上一頁退出(XD)。但如果你也在尋找一些刷題過程中的體悟,也許這篇文章對你有所啟發。

資料結構與問題情境的結合

一直以來我認為刷題都是從資料結構及演算法去解題。但真的刷了一段時間後,我發現這樣的思維其實只對一半。因為實際應用中,資料結構(Data Structures)通常不是單獨出現的,而是與具體的問題情境緊密結合。所以要以資料結構來分類可能不足以涵蓋所有情況。單靠資料結構的分類思維去解題,往往會忽略問題的實際應用場景。

提到這個原因在於我一直在思考刷LeetCode的成長關鍵在哪裡….簡單來說,透過解題過程,應該是要學會如何將它們與實際的問題情境結合在一起。這之中除了涵蓋資料結構及算法外,也涵蓋對於對應使用程式語法的熟悉度,接著就是數學與邏輯。何應用這些工具來解決實際問題。

演算法與系統設計的差異

我在刷題過程中,一直想將其與系統設計(System Design)聯繫在一起。但最後發現,這與System Design感覺不完全是同一個面向…因為某種程度來說,其實System Design屬於抽象與現實的應對實作能力,而算法就是實實在在地在考邏輯這件事情。

細部來說,System Design注重整體架構的設計,是關於如何組織、分配資源、確保系統的可擴展性、可維護性和性能等,是一種宏觀的、系統性的思維。而演算法則更專注於微觀層面的邏輯推理與效率,它解決的是如何在特定情境下,透過邏輯來達成最佳解決方案。如果要連結講在一塊演算法可以是構建System Design的一部分,但System Design的範疇遠超過演算法,它還涵蓋了分散式系統的溝通、資源分配、異常處理等多面向的實際問題。也就是說,System Design著眼於如何使系統在實際中運行,而演算法則是關鍵部分,用來解決具體的邏輯與性能挑戰。

刷題的真正價值:耐性與解題思維

所以我個人認知上,刷LeetCode是有助於思考,但對於系統設計直接幫助性不大,因為某種層面面向就是不同的思維,它屬於兩種不同的能力。

至於刷LeetCode直接助益在哪,如果是為考試刷題短期訓練,其實效益不大。但如果是扎實去思考題目整個內容,最直接幫助性我覺得應該是耐性吧…..接著就是解決問題的思維。不過我個人覺得在GPT未橫空出世前,要從LeetCode做一個有效益的學習我覺得難度頗高…因為它就是一個用程式算法與空間解決問題的複雜分析…..

流體智力(fluid intelligence)和晶體智力(crystallized intelligence)

這裡我想分享一個有趣的心理學概念,這也幫助我更好地理解刷題的意義。根據心理學理論,智力可分為兩類:流體智力(fluid intelligence)晶體智力(crystallized intelligence)。我的研究所老師曾經告訴我,聰明是可以被訓練的,我其實是很相信這件事情的。只是它面向很廣,具體作法也不同。智力提升其實是一個複雜且多層次的過程,並不是單純靠某一種方式可以達成。智力通常指的是一個人處理資訊、學習新知識、解決問題、以及適應環境的綜合能力。根據不同的心理學理論,智力包括幾個主要方面:流體智力(fluid intelligence)和晶體智力(crystallized intelligence)。稍微解釋一下這兩者差異

adaface提供

如上圖,晶體智力(左側)強調過去學習和經驗的積累,運用已知的知識來解決問題;而流體智力(右側)強調抽象思考、推理能力和解決新問題的能力,代表學習新事物和靈活應對未知情境的能力。以下為分類展開

流體智力之所以叫「流體」,是因為它代表的是大腦處理新資訊和適應新環境的能力。就像水一樣具有「流動性」,能靈活應對新問題和未知情境。而晶體智力像是累積的知識和經驗,經過學習和實踐後變得「固定」和「穩定」。這些知識和技能,像是語言、事實、規則和問題解決的策略,一旦學會了,就很難消失。這也是為什麼我們可以長期保留過去的學習成果,即便年齡增長,我們的晶體智力往往會越來越豐富。

流體智力(fluid intelligence)

在面對新問題或未經學習過的情境時,進行邏輯推理、分析和解決問題的能力。流體智力通常與抽象思維、短期記憶、問題解決和創造力有關。這種智力可以通過一些策略來提升:

  • 學習新技能:例如學習新的語言、樂器或程式語言等,訓練大腦處理新信息的能力。
  • 挑戰大腦:參加有挑戰性的智力活動,比如拼圖、數學難題、下棋、策略遊戲等。
  • 身體運動:沒錯..就是運動! 體育鍛煉,尤其是有氧運動,可以促進大腦的健康,並有助於提升認知能力。

晶體智力(crystallized intelligence)

一個人透過學習和經驗累積的知識和技能,主要包括語言理解、事實性知識和記憶力。晶體智力通常會隨著年齡和學習的增加而不斷增長,並且可以通過以下方式提高:

  • 閱讀和學習:不斷累積知識,從書籍、課程或各種學習資源中吸收新知,能夠增強晶體智力。
  • 經驗的累積:不斷進行實踐、參加各種活動、解決實際問題,這些都會增強你對世界的理解和知識。
  • 教學:將你所學的知識傳授給他人,或是在解釋複雜概念時,能進一步鞏固和深化自己的理解。

解釋完兩種智力差異,再回到刷LeetCode這件事情上,刷LeetCode涉及邏輯推理、分析問題找出有效率的解法,每次遇到新題型就要以這脈絡再度去思考這種訓練靈活思維來適應不同場景的能力就是流體智力的特徵。

而刷題過後討論體悟到的不同算法與結構最佳應用情境經驗,這就是晶體智力的一部分。隨著解的題目越多,熟悉的情境就會越來越多,此時晶體智力與流體智力就會有一定的互動性(偕同運作)。

模板思考與 AI 助力

所以我認為初學者刷Leet Code起手式,在對資料結構生疏及不懂演匴法下,絕對只知道用for跟簡易判定去處理題目。在沒有一些手法認知,例如知道如何清楚指針實作方法,或是判定題目是什麼資料結構根據題形複雜度會是什麼。建議想10min就直接進入AI 研討,過程建議照思考模板去與GPT討論。例如一開始在處理陣列問題很常遇到指針解法,當我逐漸熟悉資料結構和指針操作後,我會與GPT討論對於指針的認知

此時我就能對於指針的特質有一個更全面的認知及思考,例如就會思考滑動窗口與指針具體差異性在哪裡 ? 我認為任何設計都有其關注初衷點,我就會與AI進一步討論

在討論完後,我能理解我的認知是對的,且當我看完例子後,大致就能理解滑動窗口與指針在狀態維護的性質,一個是增量式而另一個式全局性,不限於某個連續區間。這樣整個吸收完後,除了對於這兩種的操作能更進一步理解外,且對陣列的特質有一定程度的認知。

刷題的長期思考脈絡

以上整個思緒脈絡整理完,我認為刷LeetCode其實對訓練思考有一定程度的幫助性值,不過這之中細節思考脈絡會是非常重要的環節,關係到能否有效的訓練思考。

刷 LeetCode 不僅是對資料結構和演算法的鍛鍊,還是一種全面提升解題思維的過程。無論是流體智力的鍛鍊還是晶體智力的積累,這兩者的互動最終會讓我們在面對不同問題時,能夠更有效率地找到解決方案。希望這篇文章能讓你在刷題的過程中找到屬於自己的思維模式,並進一步提升解題能力。

--

--

Spyua
spyua
Editor for

期許自己永遠當一個理論與實務結合的實踐者,了解理論更要身體力行,再透過實踐來修正自己對理論的理解。