戰(zhàn):經(jīng)典算法題解析與技巧分享)
1. 力扣刷題實(shí)戰(zhàn)2026年1月18日解題記錄今天想和大家分享我在力扣LeetCode平臺(tái)上的刷題實(shí)戰(zhàn)經(jīng)歷。作為一名程序員我堅(jiān)持每天刷題已經(jīng)三年多了這個(gè)習(xí)慣不僅幫助我保持編碼手感更重要的是培養(yǎng)了我解決問(wèn)題的思維方式。2026年1月18日這天的刷題內(nèi)容特別有意思涉及了幾道經(jīng)典題目和一些新出的題目讓我收獲頗豐。刷題不是簡(jiǎn)單地完成題目而是要理解每道題背后的算法思想和應(yīng)用場(chǎng)景。我會(huì)記錄下每道題的解題思路、遇到的坑以及優(yōu)化方法希望能給正在刷題的你一些啟發(fā)。無(wú)論你是準(zhǔn)備面試的新手還是想提升算法能力的老手這些實(shí)戰(zhàn)經(jīng)驗(yàn)都會(huì)對(duì)你有所幫助。2. 當(dāng)日刷題題目解析2.1 兩數(shù)之和經(jīng)典重溫這道題可以說(shuō)是力扣的Hello World了題目要求在一個(gè)整數(shù)數(shù)組中找到兩個(gè)數(shù)使它們的和等于一個(gè)特定的目標(biāo)值。雖然題目簡(jiǎn)單但蘊(yùn)含著重要的算法思想。我選擇了用哈希表在C中是unordered_map來(lái)解決這個(gè)問(wèn)題。具體思路是遍歷數(shù)組對(duì)于每個(gè)元素計(jì)算目標(biāo)值與該元素的差值然后檢查這個(gè)差值是否已經(jīng)在哈希表中存在。如果存在就找到了解如果不存在就把當(dāng)前元素的值和索引存入哈希表。vectorint twoSum(vectorint nums, int target) { unordered_mapint, int num_map; for (int i 0; i nums.size(); i) { int complement target - nums[i]; if (num_map.find(complement) ! num_map.end()) { return {num_map[complement], i}; } num_map[nums[i]] i; } return {}; }這個(gè)解法的時(shí)間復(fù)雜度是O(n)空間復(fù)雜度也是O(n)。雖然題目簡(jiǎn)單但有幾個(gè)需要注意的點(diǎn)要注意處理重復(fù)元素的情況要考慮沒(méi)有解的情況邊界條件如空數(shù)組需要處理2.2 二叉樹(shù)的中序遍歷迭代實(shí)現(xiàn)這道題要求實(shí)現(xiàn)二叉樹(shù)的中序遍歷通常我們會(huì)用遞歸方法但面試時(shí)面試官往往會(huì)要求用迭代方法實(shí)現(xiàn)。我選擇了用棧來(lái)模擬遞歸的過(guò)程。vectorint inorderTraversal(TreeNode* root) { vectorint result; stackTreeNode* st; TreeNode* curr root; while (curr ! nullptr || !st.empty()) { while (curr ! nullptr) { st.push(curr); curr curr-left; } curr st.top(); st.pop(); result.push_back(curr-val); curr curr-right; } return result; }這個(gè)解法有幾個(gè)關(guān)鍵點(diǎn)使用棧來(lái)保存待處理的節(jié)點(diǎn)先盡可能往左子樹(shù)深入處理完左子樹(shù)后再處理當(dāng)前節(jié)點(diǎn)最后轉(zhuǎn)向右子樹(shù)注意迭代實(shí)現(xiàn)比遞歸實(shí)現(xiàn)更容易出現(xiàn)空指針異常要特別注意對(duì)空節(jié)點(diǎn)的處理。3. 力扣熱題100中的精選題目3.1 最長(zhǎng)回文子串這道題要求找出字符串中的最長(zhǎng)回文子串。我嘗試了中心擴(kuò)展法這種方法的時(shí)間復(fù)雜度是O(n^2)空間復(fù)雜度是O(1)。string longestPalindrome(string s) { if (s.empty()) return ; int start 0, end 0; for (int i 0; i s.size(); i) { int len1 expandAroundCenter(s, i, i); int len2 expandAroundCenter(s, i, i 1); int len max(len1, len2); if (len end - start) { start i - (len - 1) / 2; end i len / 2; } } return s.substr(start, end - start 1); } int expandAroundCenter(const string s, int left, int right) { while (left 0 right s.size() s[left] s[right]) { left--; right; } return right - left - 1; }這個(gè)解法的關(guān)鍵在于回文串可能是奇數(shù)長(zhǎng)度或偶數(shù)長(zhǎng)度從每個(gè)字符或每對(duì)字符向兩邊擴(kuò)展記錄最大長(zhǎng)度和對(duì)應(yīng)的子串位置3.2 合并兩個(gè)有序鏈表這道題要求將兩個(gè)升序鏈表合并為一個(gè)新的升序鏈表。我使用了迭代的方法比較兩個(gè)鏈表的當(dāng)前節(jié)點(diǎn)將較小的節(jié)點(diǎn)連接到結(jié)果鏈表中。ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode dummy(0); ListNode* tail dummy; while (l1 l2) { if (l1-val l2-val) { tail-next l1; l1 l1-next; } else { tail-next l2; l2 l2-next; } tail tail-next; } tail-next l1 ? l1 : l2; return dummy.next; }這個(gè)解法有幾個(gè)需要注意的地方使用啞節(jié)點(diǎn)簡(jiǎn)化鏈表操作當(dāng)一個(gè)鏈表遍歷完后直接連接另一個(gè)鏈表的剩余部分注意處理空鏈表的情況4. 刷題技巧與經(jīng)驗(yàn)分享4.1 如何高效刷題經(jīng)過(guò)多年的刷題實(shí)踐我總結(jié)出了一些高效刷題的方法分類刷題不要隨機(jī)刷題應(yīng)該按題目類型分類刷比如一周專門刷二叉樹(shù)一周專門刷動(dòng)態(tài)規(guī)劃。這樣可以加深對(duì)某一類問(wèn)題的理解。五遍刷題法第一遍看題解理解思路第二遍自己實(shí)現(xiàn)第三遍24小時(shí)后重新實(shí)現(xiàn)第四遍一周后重新實(shí)現(xiàn)第五遍面試前復(fù)習(xí)記錄錯(cuò)題本把做錯(cuò)的題目和解題思路記錄下來(lái)定期復(fù)習(xí)。時(shí)間管理建議每天固定時(shí)間刷題形成習(xí)慣。我一般早上花1小時(shí)刷題效果最好。4.2 常見(jiàn)錯(cuò)誤與調(diào)試技巧在刷題過(guò)程中我遇到過(guò)很多錯(cuò)誤這里分享幾個(gè)常見(jiàn)的數(shù)組越界特別是在處理字符串或數(shù)組時(shí)容易忘記檢查邊界條件。建議在訪問(wèn)數(shù)組元素前先檢查索引是否有效。指針操作錯(cuò)誤鏈表題目中經(jīng)常出現(xiàn)指針操作錯(cuò)誤比如忘記移動(dòng)指針或者訪問(wèn)了已經(jīng)釋放的內(nèi)存??梢允褂眉埞P畫(huà)圖來(lái)幫助理解指針的變化。遞歸棧溢出遞歸解法雖然簡(jiǎn)潔但容易導(dǎo)致棧溢出。對(duì)于大數(shù)據(jù)集應(yīng)該考慮使用迭代方法。變量未初始化特別是C中局部變量不會(huì)自動(dòng)初始化使用前一定要記得初始化。調(diào)試技巧使用小數(shù)據(jù)測(cè)試邊界條件打印中間結(jié)果幫助理解程序執(zhí)行過(guò)程使用調(diào)試器單步執(zhí)行觀察變量變化4.3 面試準(zhǔn)備建議如果你是為了面試而刷題我有幾點(diǎn)建議理解比記憶重要面試官更看重你解決問(wèn)題的思路而不是你是否背過(guò)答案。溝通很重要在解題過(guò)程中要不斷與面試官交流你的思路即使還沒(méi)完全想出來(lái)??紤]多種解法對(duì)于一個(gè)問(wèn)題盡量想出多種解法并分析它們的時(shí)間復(fù)雜度和空間復(fù)雜度。寫干凈代碼面試時(shí)寫的代碼要清晰易讀有適當(dāng)?shù)淖⑨尯妥兞棵?。測(cè)試用例寫完代碼后要主動(dòng)提出測(cè)試用例包括正常情況和邊界情況。5. 力扣刷題資源推薦5.1 力扣官方資源力扣平臺(tái)本身提供了很多優(yōu)質(zhì)資源力扣熱題100精選的100道高頻面試題力扣學(xué)習(xí)計(jì)劃系統(tǒng)化的學(xué)習(xí)路徑每日一題保持刷題習(xí)慣的好方法討論區(qū)可以看到其他人的解題思路5.2 第三方學(xué)習(xí)資源除了力扣平臺(tái)我還推薦以下資源《算法導(dǎo)論》經(jīng)典算法教材適合深入理解算法原理《劍指Offer》針對(duì)面試的算法題集《編程珠璣》培養(yǎng)算法思維的好書(shū)各大高校的公開(kāi)課如MIT的算法課5.3 刷題工具推薦好的工具可以提高刷題效率VS Code輕量級(jí)代碼編輯器配合插件可以很好支持多種語(yǔ)言CLion專業(yè)的C IDE調(diào)試功能強(qiáng)大LeetHub瀏覽器插件可以自動(dòng)同步力扣代碼到GitHubDraw.io畫(huà)圖工具幫助理解復(fù)雜的數(shù)據(jù)結(jié)構(gòu)6. 個(gè)人刷題心得堅(jiān)持刷題三年多我最大的體會(huì)是刷題不是目的而是手段。通過(guò)刷題我不僅提高了編程能力更重要的是培養(yǎng)了解決問(wèn)題的思維方式。這種思維方式在工作中同樣適用比如如何分解復(fù)雜問(wèn)題如何優(yōu)化解決方案等。刷題過(guò)程中挫折是難免的。遇到難題時(shí)不要輕易放棄也不要馬上看答案。給自己足夠的時(shí)間思考即使最終沒(méi)做出來(lái)思考的過(guò)程也是有價(jià)值的。實(shí)在想不出來(lái)時(shí)再看題解然后過(guò)幾天再重新做一遍。最后刷題要注重質(zhì)量而非數(shù)量。與其快速刷100道題但都一知半解不如精刷50道題但每道都徹底理解。每道經(jīng)典題目都蘊(yùn)含著重要的算法思想理解這些思想比記住解法更重要。