刷算法一段时间的小感悟,hard 抓瞎太难了!

40 阅读3分钟

🚀目前情况

通过目前的周赛做题情况来看,我发现我目前所有能遇到的 medium 题是都能够做出来的,但是一碰到 hard 题,基本上就两眼抓瞎没有思路,不是 TLE 就是完全做不出来,这种情况持续了很久了,经常周赛是只做两题,只做三题,但是一看题解参考别人思路,又有思路能自己写出来,经过仔细斟酌,今天想出了以下几个原因

❓刷题没有闭环

碰到 hard 题基本上就不会有思考思路,没有仔细思考其题目内核的考核点,直接通过题解获取别人的做题思路,然后通过别人的思路来解题,省去自己的思考过程,以后要做好下面三点

  • 尝试讲解题目:用自己的语言给他人讲题,在评论区写出自己的题解,暴露理解漏洞。
  • 整理归类题目模板:大多数题目其实都是有定式思维解题模板的,学会归因归类
  • 多刷多解:大多数时间都花在了刷简单题上面,而没有走出舒适区攻克难关

🌈寻找空闲时间,一类题一类题解,总结方法论

找特定的周末时间,对一类题进行系统性的学习,例如数位 DP、线段树等高级算法数据结构,这种数据结构学一题就短时间不重复记忆基本过一会就忘记了,需要系统性重复学习,提高海马体记忆能力,同时这些算法的 hard 题难度究竟在哪,简单拆解了一下,我认为难度主要在以下几点:

  1. 算法复杂度的极致优化

    1. 例如:O (n) 时间解决 O (n²) 的问题(如「前缀和 + 哈希」替代暴力枚举)
    2. 典型题型:滑动窗口优化、数位 DP、状态压缩 DP
  2. 多算法 / 数据结构的组合应用

    1. 例如:图论 + 动态规划(如「最短路径 + 状态转移」)、线段树 + 贪心
    2. 典型题型:「LeetCode 312. 戳气球」(区间 DP + 记忆化搜索)
  3. 隐藏的数学规律或问题转化

    1. 例如:将几何问题转化为图论问题(如「LeetCode 1631. 最小体力消耗路径」)
    2. 或利用数论性质简化计算(如欧拉函数、莫比乌斯反演)
  4. 复杂状态设计与转移

    1. 例如:三维动态规划、带状态的 DFS/BFS(如「LeetCode 139. 单词拆分」的记忆化搜索)

🏢不忘初心,刷算法的最终目的到底是什么

其实刷算法的主要目的还是来找工作的,咱其实也不是来打竞赛的,所以其实难度很深很高的题,没有必要进行深究,最近也是看了很多文章,发现其实追求技术深度这件事其实是无解的,工作业务需求之中根本就不需要这么深的数据结构,而是业务驱动的,最简单来说 CRUD、顶多来个 DFS、BFS 这种算法就已经能够到达工作所需的算法极限了。

所以在刷算法题之外,还更需要准备一些提高自己找工作能力,面试官看的到的一些数据来协助自己!