0%

算法刷题记录

剑指 Offer

4. 二维数组中的查找

从数组右上角(或左下角)开始找,遇到比 target 小的向下(右)找,遇到比 target 大的向左(上)找。

10 - II. 青蛙跳台阶问题

本题可转化为 求斐波那契数列第 n 项的值,使用动态规划求解

11. 旋转数组的最小数字

二分查找:将中间值与最后一个值比较,若大,将 left = mid + 1,若小,将 right = mid,若等,则 right -= 1

12. 矩阵中的路径

本质上是图的深搜,使用递归求解

13. 机器人的运动范围

广搜模板题

15. 二进制中 1 的个数

巧用 n & (n-1)

16. 数值的整数次方

1
2
3
4
while n:
if n & 1: res *= x
x *= x
n >>= 1

17. 打印从 1 到最大的 n 位数

有点深搜的意思

19. 正则表达式匹配

动态规划/dfs

20. 表示数值的字符串

有限状态机

21. 调整数组顺序使奇数位于偶数前

双指针,左遇偶停,右遇奇停

24. 反转链表

双指针,一个在前一个在后,调整 next

30. 包含 min 函数的栈

建立辅助栈,存储栈中所有非严格降序的元素,辅助栈中栈顶元素始终是最小值

31. 栈的压入、弹出序列

辅助栈模拟 push pop

33. 二叉查找树的后序遍历序列

根据大小比较划分左右子树,验证左右子树区间的单调性

34. 二叉树中和为某一值的路径

回溯,target 减遍历到的每个值

35. 复杂链表的复制

dfs + 哈希表

36. 二叉搜索树与双向链表

中序遍历 + dfs

38. 字符串的排列

dfs

39. 数组中出现次数超过一半的数字

摩尔投票法,假设是当前数,票数为 0 抵消

40. 最小的 k 个数

最大堆实现

Leetcode

3. 无重复字符的最长字串

滑窗,建 hash table,判断下一个字符是否在表,若在则 update table 并缩短滑窗。时间 n

5. 最长回文子串

中心扩散。时间 n^2,空间 1

7. 整数反转

原数 pop,reverse push,注意检查溢出:INT_MAX/10

9. 回文数

原数 pop,reverse push,直到 原数 < reverse,判断 原数是否 == reverse,或者 == reverse / 10。时间 log n

11. 盛最多水的容器

双指针,计算容纳的水量,数字较小的指针向内移动,再次计算。时间 n,空间 1

15. 三数之和

排序 + 双指针,a + b + c > target 就将 c 左移一个,排序时间 n log n,双指针时间 n^2,总时间 n^2。空间 log n

16. 最接近的三数之和

排序 + 双指针,a + b + c >= target 将 c 左移,< target 将 b 右移

17. 电话号码的字母组合

回溯/队列,依次组合