力扣刷题实战:经典算法题解析与技巧分享
2026/8/9 3:12:23 网站建设 项目流程

1. 力扣刷题实战:2026年1月18日解题记录

今天想和大家分享我在力扣(LeetCode)平台上的刷题实战经历。作为一名程序员,我坚持每天刷题已经三年多了,这个习惯不仅帮助我保持编码手感,更重要的是培养了我解决问题的思维方式。2026年1月18日这天的刷题内容特别有意思,涉及了几道经典题目和一些新出的题目,让我收获颇丰。

刷题不是简单地完成题目,而是要理解每道题背后的算法思想和应用场景。我会记录下每道题的解题思路、遇到的坑以及优化方法,希望能给正在刷题的你一些启发。无论你是准备面试的新手,还是想提升算法能力的老手,这些实战经验都会对你有所帮助。

2. 当日刷题题目解析

2.1 两数之和(经典重温)

这道题可以说是力扣的"Hello World"了,题目要求在一个整数数组中找到两个数,使它们的和等于一个特定的目标值。虽然题目简单,但蕴含着重要的算法思想。

我选择了用哈希表(在C++中是unordered_map)来解决这个问题。具体思路是遍历数组,对于每个元素,计算目标值与该元素的差值,然后检查这个差值是否已经在哈希表中存在。如果存在,就找到了解;如果不存在,就把当前元素的值和索引存入哈希表。

vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, 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 {}; }

这个解法的时间复杂度是O(n),空间复杂度也是O(n)。虽然题目简单,但有几个需要注意的点:

  1. 要注意处理重复元素的情况
  2. 要考虑没有解的情况
  3. 边界条件如空数组需要处理

2.2 二叉树的中序遍历(迭代实现)

这道题要求实现二叉树的中序遍历,通常我们会用递归方法,但面试时面试官往往会要求用迭代方法实现。我选择了用栈来模拟递归的过程。

vector<int> inorderTraversal(TreeNode* root) { vector<int> result; stack<TreeNode*> 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; }

这个解法有几个关键点:

  1. 使用栈来保存待处理的节点
  2. 先尽可能往左子树深入
  3. 处理完左子树后再处理当前节点
  4. 最后转向右子树

注意:迭代实现比递归实现更容易出现空指针异常,要特别注意对空节点的处理。

3. 力扣热题100中的精选题目

3.1 最长回文子串

这道题要求找出字符串中的最长回文子串。我尝试了中心扩展法,这种方法的时间复杂度是O(n^2),空间复杂度是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; }

这个解法的关键在于:

  1. 回文串可能是奇数长度或偶数长度
  2. 从每个字符或每对字符向两边扩展
  3. 记录最大长度和对应的子串位置

3.2 合并两个有序链表

这道题要求将两个升序链表合并为一个新的升序链表。我使用了迭代的方法,比较两个链表的当前节点,将较小的节点连接到结果链表中。

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; }

这个解法有几个需要注意的地方:

  1. 使用哑节点简化链表操作
  2. 当一个链表遍历完后,直接连接另一个链表的剩余部分
  3. 注意处理空链表的情况

4. 刷题技巧与经验分享

4.1 如何高效刷题

经过多年的刷题实践,我总结出了一些高效刷题的方法:

  1. 分类刷题:不要随机刷题,应该按题目类型分类刷,比如一周专门刷二叉树,一周专门刷动态规划。这样可以加深对某一类问题的理解。

  2. 五遍刷题法

    • 第一遍:看题解,理解思路
    • 第二遍:自己实现
    • 第三遍:24小时后重新实现
    • 第四遍:一周后重新实现
    • 第五遍:面试前复习
  3. 记录错题本:把做错的题目和解题思路记录下来,定期复习。

  4. 时间管理:建议每天固定时间刷题,形成习惯。我一般早上花1小时刷题,效果最好。

4.2 常见错误与调试技巧

在刷题过程中,我遇到过很多错误,这里分享几个常见的:

  1. 数组越界:特别是在处理字符串或数组时,容易忘记检查边界条件。建议在访问数组元素前先检查索引是否有效。

  2. 指针操作错误:链表题目中经常出现指针操作错误,比如忘记移动指针,或者访问了已经释放的内存。可以使用纸笔画图来帮助理解指针的变化。

  3. 递归栈溢出:递归解法虽然简洁,但容易导致栈溢出。对于大数据集,应该考虑使用迭代方法。

  4. 变量未初始化:特别是C++中,局部变量不会自动初始化,使用前一定要记得初始化。

调试技巧:

  • 使用小数据测试边界条件
  • 打印中间结果帮助理解程序执行过程
  • 使用调试器单步执行观察变量变化

4.3 面试准备建议

如果你是为了面试而刷题,我有几点建议:

  1. 理解比记忆重要:面试官更看重你解决问题的思路,而不是你是否背过答案。

  2. 沟通很重要:在解题过程中,要不断与面试官交流你的思路,即使还没完全想出来。

  3. 考虑多种解法:对于一个问题,尽量想出多种解法,并分析它们的时间复杂度和空间复杂度。

  4. 写干净代码:面试时写的代码要清晰易读,有适当的注释和变量命名。

  5. 测试用例:写完代码后,要主动提出测试用例,包括正常情况和边界情况。

5. 力扣刷题资源推荐

5.1 力扣官方资源

力扣平台本身提供了很多优质资源:

  • 力扣热题100:精选的100道高频面试题
  • 力扣学习计划:系统化的学习路径
  • 每日一题:保持刷题习惯的好方法
  • 讨论区:可以看到其他人的解题思路

5.2 第三方学习资源

除了力扣平台,我还推荐以下资源:

  1. 《算法导论》:经典算法教材,适合深入理解算法原理
  2. 《剑指Offer》:针对面试的算法题集
  3. 《编程珠玑》:培养算法思维的好书
  4. 各大高校的公开课:如MIT的算法课

5.3 刷题工具推荐

好的工具可以提高刷题效率:

  1. VS Code:轻量级代码编辑器,配合插件可以很好支持多种语言
  2. CLion:专业的C++ IDE,调试功能强大
  3. LeetHub:浏览器插件,可以自动同步力扣代码到GitHub
  4. Draw.io:画图工具,帮助理解复杂的数据结构

6. 个人刷题心得

坚持刷题三年多,我最大的体会是:刷题不是目的,而是手段。通过刷题,我不仅提高了编程能力,更重要的是培养了解决问题的思维方式。这种思维方式在工作中同样适用,比如如何分解复杂问题,如何优化解决方案等。

刷题过程中,挫折是难免的。遇到难题时,不要轻易放弃,也不要马上看答案。给自己足够的时间思考,即使最终没做出来,思考的过程也是有价值的。实在想不出来时,再看题解,然后过几天再重新做一遍。

最后,刷题要注重质量而非数量。与其快速刷100道题但都一知半解,不如精刷50道题但每道都彻底理解。每道经典题目都蕴含着重要的算法思想,理解这些思想比记住解法更重要。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询