03 LeetCode 入門與攻略

马鸿旭 2024-09-08 11:22 6次浏览 0 条评论 taohigo.com
  • 本文首發於我的個人博客:「程序員充電站」
  • 文章鏈接:「傳送門」
  • GitHub 地址(歡迎 「Star ★ 」 和 「Fork」):https://github.com/itcharge/LeetCode-Py

1. LeetCode 是什麼

「LeetCode」 是一個代碼在線評測平臺(Online Judge),包含瞭 算法、數據庫、Shell、多線程 等不同分類的題目,其中以算法題目為主。我們可以通過解決 LeetCode 題庫中的問題來練習編程技能,以及提高算法能力。

LeetCode 上有 2300+ 道的編程問題,支持 16+ 種編程語言(C、C++、Java、Python 等),還有一個活躍的社區,可以用於分享技術話題、職業經歷、題目交流等。

並且許多知名互聯網公司在面試的時候喜歡考察 LeetCode 題目,通常會以手寫代碼的形式出現。需要面試者對給定問題進行分析並給出解答,有時還會要求面試者分析算法的時間復雜度和空間復雜度,以及算法思路。面試官通過考察面試者對常用算法的熟悉程度和實現能力來確定面試者解決問題的思維能力水平。

無論是面試國內還是國外的知名互聯網公司,通過 LeetCode 刷題,充分準備好算法,對拿到一個好公司的好 offer 都是有幫助的。

2. LeetCode 新手入門

2.1 LeetCode 註冊

  1. 打開 LeetCode 中文主頁,鏈接:力扣(LeetCode)官網。
  2. 輸入手機號,獲取驗證碼。
  3. 輸入驗證碼之後,點擊「登錄 / 註冊」,就註冊好瞭。

2.2 LeetCode 題庫

[「題庫」](題庫 – 力扣 (LeetCode) 全球極客摯愛的技術成長平臺)是 LeetCode 上最直接的練習入口,在這裡可以根據題目的標簽、難度、狀態進行刷題。也可以點擊「隨機一題」開始刷題。

2.2.1 題目標簽

LeetCode 的題目涉及瞭許多算法和數據結構。有貪心,搜索,動態規劃,鏈表,二叉樹,哈希表等等,可以通過選擇對應標簽進行專項刷題,同時也可以看到對應專題的完成度情況。

2.2.2 題目列表

LeetCode 提供瞭題目的搜索過濾功能。可以篩選相關題單、不同難易程度、題目完成狀態、不同標簽的題目。還可以根據題目編號、題解數目、通過率、難度、出現頻率等進行排序。

2.2.3 當前進度

當前進度提供瞭一個直觀的進度展示。在這裡可以看到自己的練習概況。進度會自動展現當前的做題情況。也可以點擊「進度設置」創建新的進度,在這裡還可以修改、刪除相關的進度。

2.2.4 題目詳情

從相關題目的鏈接點擊進去,就可以看到這道題目的內容描述和代碼編輯器。在這裡還可以查看相關的題解和自己的提交記錄。

2.3 LeetCode 刷題語言

大廠在面試算法的時候考察的是基本功,用什麼語言沒有什麼限制,也不會影響成績。日常刷題建議使用自己熟悉的語言,或者語法簡潔的語言刷題。

相對於 JavaPython 而言,CC++ 相關的語法比較復雜,在做題的時候一方面需要思考思路,另一方面還要研究語法。並且復雜的語法也不利於看懂思路,耗費時間較多,不利於刷題效率。在面試的時候往往需要一個小時內盡可能的完成更多的題目,C++ 一旦語法出錯很容易慌亂。當然 LeetCode 周賽的大神更偏向於使用 C++ 刷題,這是因為用 C++ 參加算法競賽已經成為傳統瞭,絕大多數的 OI / ACM 競賽選手都是 C++ 大神。

就我個人經歷而言,我大學參加 ACM 競賽的時候,用的是 CC++ 語言和一點點的 Java。現在刷 LeetCode 為瞭更高的刷題效率,選擇瞭 Python。感覺用 Python 刷題能更加專註於算法與數據結構本身,也能獲得更快的刷題效率。

2.4 LeetCode 刷題流程

在「2.2 LeetCode 題庫 —— 2.2.4 題目詳情」中我們介紹瞭題目的相關情況。

可以看到左側區域為題目內容描述區域,在這裡可以看到題目的內容描述和一些示例數據。而右側是代碼編輯區域,代碼編輯區域裡邊默認顯示瞭待實現的方法。

我們需要在代碼編輯器中根據方法給定的參數實現對應的算法,並返回題目要求的結果。然後還要經過「執行代碼」測試結果,點擊「提交」後,顯示執行結果為 「通過」 時,才算完成一道題目。

總結一下我們的刷題流程為:

  1. 在 LeetCode 題庫中選擇一道自己想要解決的題目。
  2. 查看題目左側的題目描述,理解題目要求。
  3. 思考解決思路,並在右側代碼編輯區域實現對應的方法,並返回題目要求的結果。
  4. 如果實在想不出解決思路,可以查看題目相關的題解,努力理解他人的解題思路和代碼。
  5. 點擊「執行代碼」按鈕測試結果。
  • 如果輸出結果與預期結果不符,則回到第 3 步重新思考解決思路,並改寫代碼。
  1. 如果輸出結果與預期符合,則點擊「提交」按鈕。
  • 如果執行結果顯示「編譯出錯」、「解答錯誤」、「執行出錯」、「超出時間限制」、「超出內存限制」等情況,則需要回到第 3 步重新思考解決思路,或者思考特殊數據,並改寫代碼。
  1. 如果執行結果顯示「通過」,恭喜你通過瞭這道題目。

接下來我們將通過「1. 兩數之和 – 力扣(LeetCode)」這道題目來講解如何在 LeetCode 上刷題。

2.5 LeetCode 第一題

2.5.1 題目鏈接

  • 1. 兩數之和 – 力扣(LeetCode)

2.5.2 題目大意

  • 描述:給定一個整數數組 nums 和一個整數目標值 target
  • 要求:在該數組中找出和為 target 的兩個整數,並輸出這兩個整數的下標。

2.5.3 解題思路

  1. 思路一:暴力搜索

最簡單的思路是遍歷數組,對於數組中每一個數 nums[i],尋找數組中是否存在 target - nums[i]

但是這樣利用瞭兩重循環暴力搜素,時間復雜度為 O(n^2),雖然能解決問題,但是還有更好的解決思路。

  1. 思路二:哈希表

另一種思路是利用哈希表。字典中鍵值對信息為 target-nums[i] :ii 為下標。

遍歷數組,對於每一個數 nums[i],先查找字典中是否存在 target - nums[i],存在則輸出 target - nums[i] 對應的下標和當前數組的下標 i。沒有則在字典中存入 target-nums[i] 的下標 i

2.5.4 解題代碼

  1. 思路一:暴力搜索

class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
size = len(nums)
for i in range(size):
for j in range(i + 1, size):
if nums[i] + nums[j] == target:
return [i, j]
return []