練習演算法題目的訣竅與經驗分享

更新於 發佈於 閱讀時間約 2 分鐘

1.

競賽題 或者 面試題 Medium Hard 以上題目,一開始在第一時間想不出解題思路,或者最佳解是很平常的事情
通過官方解答、討論區的高手分享解題,進而學到新的解題思路,或者更泛用的演算法框架,就是最大的收穫


2.

但是Easy分類的題目通常就是該領域最基礎的題目應該要會
如果想不到,可以試著從約束條件、進階提問follow-up、或者Hint尋求幫助。

如果還是毫無頭緒,很可能是基礎知識不足,需要先找一本看得懂,可以吸收的教材(比如說原本學校教過的課本,或者MIT、哈佛、史丹佛、Coursera...等國內外大學、教育平台的網路公開課)

如果是知道該用什麼演算法,但是實作coding就是卡卡的,東漏西漏,常常報compile error,很可能是程式語言的特性還不熟練,這點就需要回去加強練習該程式語言的基本語法與函示庫。(例如C++和其互相搭配的STL)


3.

練Leetcode題目時,不需要土法煉鋼式的從第一號題刷到最後一題,因為題目編號並沒有照難易度排,也沒有照分類排。

建議有條理的練習有分類的練習,一般入門、練手感建議從基本的Binary Tree、Array、String、Math...等標籤分類開始,接著開始練習專門領域DP、Greedy、Divide and Conquer、Sliding window、Two pointers、Graph...等。

從Easy 開始往Medium邁進,Hard有多餘時間再做,太難的往往遇到機會也比較低,或者太過於刁鑽。


4.

學會的題目,在第一次通過之後的兩~三天,務必在不看答案的情況下再做一次,加深印象並且強化、鞏固知識點(這點和大腦的自然遺忘曲線有關)。

做題目依該像蹲馬步,基本功穩健先求演算法徹底理解、熟練,之後才逐漸開始衝刺題目數量。

在不熟練演算法、資料結構、程式語言特性的情況下,盲目地刷題只是徒勞,耗費一堆時間,看了很多但是也忘了很多,而且也不紮實。

妥善利用 Leetcode建立好的學習卡片,針對某個領域去加強練習,熟悉演算法框架。

Explore - LeetCode


5.

試著輸出。不論是教其他同學,或者畫圖、做筆記都是很好的方式。

Teaching is learning.

當你能把另一個人給教懂,徹底理解,並且說明其精隨與關鍵知識點,說明你已經掌握這道題目的考點、可能的變化衍伸與演算法、資料結構...等相關背景知識


avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給定我們一個陣列,要求我們找出裡面出現次數最多的數字。 出現次數最多的數字也就是我們在統計上所謂的 眾數 mode
題目會給一個輸入陣列,裡面的數字分別代表每個index對應到的高度,要求我們計算山峰與低谷的數目,總共有多少個。 山峰 Hill: 比最靠近高度不相同的兩個鄰居的高度還要高。 低谷 Valley:比最靠近高度不相同的兩個鄰居的高度還要低。
題目會給一個輸入陣列,要求我們判斷所有的數字是否構成一組單調數列。 也就是全部的數字構成一條單調遞增數列(逐漸變大), 或者一條單調遞減數列(逐漸變小)?
題目會給我們一個陣列,分別代表高低各不同的隔板高度,問我們從降雨之後,最多可以儲存多少水量?
雖然表面是一道移除元素的題目,但實際上考的還是搬移。 題目要求的是把val目標值移除,等價於 把非目標值的搬到前面,並且回傳這些剩下來的元素個數(也就是 陣列裡面,非目標值的元素總數​)。 請看下方範例,會更好理解。
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
題目會給定我們一個陣列,要求我們找出裡面出現次數最多的數字。 出現次數最多的數字也就是我們在統計上所謂的 眾數 mode
題目會給一個輸入陣列,裡面的數字分別代表每個index對應到的高度,要求我們計算山峰與低谷的數目,總共有多少個。 山峰 Hill: 比最靠近高度不相同的兩個鄰居的高度還要高。 低谷 Valley:比最靠近高度不相同的兩個鄰居的高度還要低。
題目會給一個輸入陣列,要求我們判斷所有的數字是否構成一組單調數列。 也就是全部的數字構成一條單調遞增數列(逐漸變大), 或者一條單調遞減數列(逐漸變小)?
題目會給我們一個陣列,分別代表高低各不同的隔板高度,問我們從降雨之後,最多可以儲存多少水量?
雖然表面是一道移除元素的題目,但實際上考的還是搬移。 題目要求的是把val目標值移除,等價於 把非目標值的搬到前面,並且回傳這些剩下來的元素個數(也就是 陣列裡面,非目標值的元素總數​)。 請看下方範例,會更好理解。
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
前言 常在寫 leet code 的朋友應該都知道,除了解出題目很重要,還有時間複雜度以及空間複雜度的問題,若能更理解時間複雜度,然後優化解法,就可以讓寫程式的基本底子更上一層樓,以下簡單介紹常見的時間複雜度以及演算法。 除了時間複雜度,也會順便簡單說明相關東西,如下: 相關演算法
Thumbnail
本文分享了在面試演算法工程師時經常會遇到的問題及解題方法,包括複雜度分析、五大演算法的介紹、排序方法及動態規劃等。希望這些資訊能幫助求職者在面試時有更好的準備、提高自信,並提供參考資料以便深入學習相關內容。
Thumbnail
透過閱讀《超牢記憶法》所學到的提升記憶力的技巧,包括提取練習、間隔學習以及交錯學習等方法。透過自我測試及定期回顧,能有效深化長期記憶,克服記憶力不佳的困擾。這些方法促使作者在學習中取得顯著進步,希望能對讀者有所幫助。
Thumbnail
在開始學習計畫前的三個問題 為什麼學? 該學什麼? 如何去學? 為什麼學的主要歸類 本質性的學習 為了學習而去學習 不確定將來如何使用 功能性的學習 學習這個技能或主題可以幫助自己達成目標 該學什麼? 概念 若某些事物需要被理解而非只是記憶,就屬於概念 ex: 學習人工智能
數學系的訓練,與上面閱讀原始碼的優先順序,本質上是反過來的。在數學的訓練中,是先把函數定義的非常清楚,再進一步去看函數應用在具體的數據上會發生什麼行為,然後就到此為止,不太會再有進一步的討論。但如上面西尾泰和所述,工程師看事情的角度,是先掌握全局,然後再進一步細化每一層的細節。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
學習適當的背誦對於數學學習來說是好事,但並不是要求學生把每個算式從頭背到尾,而是需要理解和應用數學概念。毫無壓力的學習沒有不好,但必須接受沒什麼成效的結果。透過自律性的執行計劃,避免沉迷於不當消遣,才能加強學習的效果。
你正在學習編程,探索算法和數據結構,在這個過程中,你會遇到許多複雜的問題,比如如何分析算法的性能、如何證明算法的正確性,以及如何解決優化問題。這時,你會發現《Concrete Mathematics》是一個非常有用的資源。
Thumbnail
學習程式語言是一個不容易的過程,但有效的學習方法可以幫助你克服挫折,這篇文章分享了一個程式設計師的學習心得以及一些建議,包括課後實作、短期學習、跟別人比較等注意事項,同時提供了一些相關的教學資源。
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
前言 常在寫 leet code 的朋友應該都知道,除了解出題目很重要,還有時間複雜度以及空間複雜度的問題,若能更理解時間複雜度,然後優化解法,就可以讓寫程式的基本底子更上一層樓,以下簡單介紹常見的時間複雜度以及演算法。 除了時間複雜度,也會順便簡單說明相關東西,如下: 相關演算法
Thumbnail
本文分享了在面試演算法工程師時經常會遇到的問題及解題方法,包括複雜度分析、五大演算法的介紹、排序方法及動態規劃等。希望這些資訊能幫助求職者在面試時有更好的準備、提高自信,並提供參考資料以便深入學習相關內容。
Thumbnail
透過閱讀《超牢記憶法》所學到的提升記憶力的技巧,包括提取練習、間隔學習以及交錯學習等方法。透過自我測試及定期回顧,能有效深化長期記憶,克服記憶力不佳的困擾。這些方法促使作者在學習中取得顯著進步,希望能對讀者有所幫助。
Thumbnail
在開始學習計畫前的三個問題 為什麼學? 該學什麼? 如何去學? 為什麼學的主要歸類 本質性的學習 為了學習而去學習 不確定將來如何使用 功能性的學習 學習這個技能或主題可以幫助自己達成目標 該學什麼? 概念 若某些事物需要被理解而非只是記憶,就屬於概念 ex: 學習人工智能
數學系的訓練,與上面閱讀原始碼的優先順序,本質上是反過來的。在數學的訓練中,是先把函數定義的非常清楚,再進一步去看函數應用在具體的數據上會發生什麼行為,然後就到此為止,不太會再有進一步的討論。但如上面西尾泰和所述,工程師看事情的角度,是先掌握全局,然後再進一步細化每一層的細節。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
學習適當的背誦對於數學學習來說是好事,但並不是要求學生把每個算式從頭背到尾,而是需要理解和應用數學概念。毫無壓力的學習沒有不好,但必須接受沒什麼成效的結果。透過自律性的執行計劃,避免沉迷於不當消遣,才能加強學習的效果。
你正在學習編程,探索算法和數據結構,在這個過程中,你會遇到許多複雜的問題,比如如何分析算法的性能、如何證明算法的正確性,以及如何解決優化問題。這時,你會發現《Concrete Mathematics》是一個非常有用的資源。
Thumbnail
學習程式語言是一個不容易的過程,但有效的學習方法可以幫助你克服挫折,這篇文章分享了一個程式設計師的學習心得以及一些建議,包括課後實作、短期學習、跟別人比較等注意事項,同時提供了一些相關的教學資源。
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。