Offer03:数组中重复数字
没看题解,只用了dict做哈希映射
Offer04:二维数组中的查找
方法1 左下角开始查找,比target大i--,比target小j++ (右上也可以)
方法2 二分法(暂时没看到易懂的,而且时间会长)
Offer05:替换空格
没看题解 join+split
Offer06:倒序打印链表
没看题解 递归
Offer07:重建二叉树
没看题解 递归 preorder[0]一定为根节点
Offer09:两个栈实现队列
看了提示,用一个栈去做另一个的倒序
题解优化,不做deleteHead的时候可以不倒序
Offer10:Fibonacci数列(青蛙跳台阶)
栽大跟头 动态规划需要加强--为传统的分治法节省大量冗余计算,用空间换时间
Offer11:旋转数组最小值
二分法寻找,递归的程序很慢,二分法是不是应该搭配指针routine,而不是递归
Offer12:矩阵中的路径
dfs的经典题目 递归+标记+剪枝
Offer13:机器人的运动范围
bfs/dfs 普通queue循环或者递归 做bfs时发现,通过已访问的set进行剪枝可以让程序提速很多,否则通不过
Offer14:剪绳子
纯数学推导:算数平均》几何平均 -- 等分带来最大积,对y=x^(1/x)进行求导 -- 以3等分最佳。最后考虑长度模3的三张情况以及特异解
DP:暴力递归的优化版本(添加记忆)
Offer16:数值的整数次方
二分法递归,发现一个有趣的事情。代码如果写成x**2会有overflow但是如果写成x*x就能通过。
Offer17:打印1到最大的n位数
进阶算法:转成字符串做dfs
Offer18:删除链表的节点
此题单双指针都可以用,复杂度为On。但如果target是链表的话,可以跳过搜索,直接暴力替换,复杂度为O1,但要注意尾部元素不能这么做,因为不能向函数内的链表直接接null(需要再查),所以会退化回On
Offer19:正则表达式匹配
回溯算法,需要重做
Offer20:判断表示数值的字符串
此题目用到有限状态自动机,涉及图算法。不会,需要重做
或者使用基础的逻辑判断法,设置三个met的bool,逐位考虑所有情况。
Offer21:调整奇偶数
利用快排思想的双指针(需要注意循环内顺序)
Offer22:链表中倒数第k个数
双指针避免查数过程
Offer24:反转链表
双指针方法简单,递归方法理解起来很难,在递归内貌似不能直接替换链表,需要手动temp替换
更新:递归内部时应注意让反转后的尾部接向None,防止循环递归
Offer25:合并有序链表
递归
Offer26:树的子结构
双递归,需要重做。明确终止条件
Offer27:镜像树
递归,平行赋值
Offer28:对称树判断
递归,需要重做
Offer29:顺时针打印矩阵
我用的递归,但是貌似很蠢。普通的迭代就可以
python五行代码 矩阵行列对换:matrix=list(zip(*matrix)), list反转顺序:a=a[::-1]
Offer30:包含min函数的栈
辅助栈来确保自己的顶端是数据栈的最小值,用空间来换时间
Offer31:判断栈队列
辅助栈来模拟入栈出栈的过程,双循环
Offer32:从上到下打印二叉树:
bfs算法,扩展(按层分数组打印),创建一个数组用来记录层数
Offer33:二叉搜索树的后序遍历序列
递归分治 复杂度nn,单调栈 复杂度n 需要重点复习
Offer34:二叉树中和为某一值的路径
dfs搜索+回溯 python中,如果在递归内引用a.append(b),若b为数组,则传入的是地址,后续对b的改动还会影响到a
需要在dfs中考虑回溯
Offer35:复杂链表的复制(深复制)
dfs,bfs都可以,需要用visited来记录避免重复复制。最优解法是原地复制然后再拆分链表,这样空间复杂度是O1
Offer36:二叉搜索树转化成双向链表
中序遍历二叉搜索树形成递增链表,能通过大多数测试通不过少数测试大概率是因为终止条件的设置
python函数套层时应注意:list等地址可不用self包装,int等变量需要被self包装否则私有化
Offer37:序列化二叉树,反序列化
bfs序列化,dfs反序列化
Offer38:字符串的排列(排列组合)
用数组visited来表示所有步骤中的路径来对dfs进行剪枝 (交换法,减少内存占用)
Offer39:数组中出现次数超过一半的数字
摩尔投票法
Offer40:最小k数
复习快速排序最好的题目
还可以使用最大堆来解--python中的heapq.heapify()是默认最小堆,此时应取负数来维护
Offer41:中位数
大小堆:
大【小堆 + 大堆】小