剑指offer笔记

剑指offer
第二章:
2.3 数据结构
2.3.1  数组
数组与指针的区别
数组作为入参,变为指针。
二维数组查找。
左上小,右下大
判断右上值,大于去掉列,小于去掉行。
2.3.2  字符串
内存申请问题。
替换空格,从后往前。
2.3.3 链表
添加
删除
从尾部到头部打印,可以翻转列表(允许修改链表),否则就是使用栈,即先进后出。
递归实现。
2.3.4 树
前序:根 左 右
中序:左 根 右
后续:左 右 根
递归实现 循环实现  dfs
bfs 队列实现
二叉搜索树
堆,最大堆、最小堆
红黑树
b树
重建二叉树:
前序、中序
前序、后序
中序、后序
分析二叉树的特征。
前序遍历:根部、左子树、右子树
中序遍历:左子树、根、右子树
后序遍历:左子树、右子树、根。
注意,前序的根后面就是左子树的根,后序的根前面就是右子树的根。
2.3.5  栈和队列
分别用链表实现队列和栈
两个栈实现队列
两个队列实现栈
2.4 算法和数据结构
2.4.1 查找和排序
哈希表和二叉排序树,着重数据结构
归并、快速排序 手写,信手拈来
地址下标排序,小数据比较合适
旋转数组的最小数字
2.4.2 递归和循环
fibonacci递归版、循环版
爬楼梯,2*1 矩形覆盖2*8
2.4.3 位运算
死循环版、常规版、剖析版
第三章
3.2 规范性:书写 布局 命名
3.3 完整性:代码完整 3种错误处理的方法
返回值 全局变量 异常
数值的整数次方,完整版、递归版
删除链表节点O(1),注意所删除节点的位置,头部、中间、尾部
调整数组顺序使得奇数位于偶数的前面,leetcode中的two points,数组中的操作用交换代替。普通版以及重构版,适应性强,类似于qsort lib库函数
3.4 代码的鲁棒性
链表中倒数第k个节点。注意鲁棒性。
链表翻转,常规操作。不过这里的代码可以去掉while中的判断的,返回pre。
合并两个排序的链表。
树的字结构,先找根,然后再遍历子。递归实现。
第四章
4.2 画图让抽象问题形象化
二叉树镜像,先序交换。
顺时针打印矩阵。
4.3 举例让抽象问题具体化
最小栈
栈的压入,弹出序列
从上往下打印二叉树,bfs,使用队列。
二叉树中和为某一值的路径,leetcode 113。使用递归保存序列,或者用队列。
4.4 分解让复杂问题简单化
复杂链表的复制。哈希表版、拷贝、移动、拆分版。
二叉搜索树与双向链表,中序遍历,操作左指针指向上一个节点,初始值设为NULL。
字符串排列,递归实现。
 
第五章
5.2 时间效率
数组中出现次数超过一半的数字,直接排序返回中间值啦,然而是nlgn,有基于快速排序的O(n)版以及一加一减的消除法。
最小的k个数,可以修改输入的partition法,O(n)。小批量的排序法,nlgk。
连续子数组的最大和,动规。从左至右,当前和小于0,则更新为当前值,否则加上当前值,更新最大值。
从1到n整数中1出现的次数,迭代求余版,n*logn,递归版,O(logn)
5.3 时间效率与空间效率的平衡
第一个只出现一次的字符,hash表。
数组中的逆序对
两个链表的第一个公共节点,先确认是否相交,即最后一个节点是否相同,然后长短对比,长的先走,然后逐个对比,找到交汇点。m+n+m-n到m+n+m。
 
第六章
6.2 沟通能力和学习能力 
6.3 知识迁移能力
数字在排序数组中出现的次数,我的想法是逐个对比,O(n),不及格,这里是二分查找确定第一个k和最后一个k,然后计算出长度,O(lgn)
二叉树深度,递归,返回 1 + max(left, right)。
二叉树是否balance,前序判断左右子树的深度差,然后递归调用,此版本的问题是涉及到重复计算。后序判断则不会出现这个问题。
数组中只出现一次的数字,异或的妙用,O(n)。
和为s的两个数字,two points问题,首尾两个指针。小于前指针向后移动,大于后指针向前移动。
和为s的序列,前一个题是这个题的特例,即只有两个数字的序列,这个是泛化后的版本,还是两个指针,小于就移动尾指针向后,大于就移动首指针向后移,第一原则是尽可能使得序列中的数字多一些,也就是使得所有的情况都覆盖到。然后重复。
翻转单词顺序,两次翻转,先翻转整个句子,后翻转每个单词。
字符串的左旋操作,三次翻转,翻转前面的n个字符,然后翻转后面的字符,然后翻转整个字符串。
6.4 抽象建模能力
n个骰子的点数,递归和循环实现。
扑克牌的顺子,分析牌面,大小王特殊处理。然后排序,然后是逐个相减,差值之和与大小王的个数进行对比。这里要除掉一种情况,即相等。
圆圈中剩下的数字,约瑟夫环问题。找出规则。
6.5 发散思维能力
求1+2+3+…+n,在约定条件下,偏向于利用c++的特殊性,跳过。
不用加减乘除做加法,使用位运算。先异或,然后相与,如果存在进位,则将原来的两个数替换为异或后的值与相与移位后的值。
不能被继承的类,跳过。
第七章
str2int,发现确实是缺很多。
最低公共祖先。
第八章
8.1 数组
数组中重复的数字,排序法,然后前后对比。哈希表。巧妙利用下标。
构建乘积数组,跳过。
8.2 字符串
正则表达式匹配,跳过。
表示数值的字符串,跳过。
字符流中第一个不重复的字符,用哈希表实现,256。
8.3 链表
链表中环的入口节点,采用先判断是否有环,然后找出环内的节点数,快慢指针。
删除链表中重复的节点。注意有可能是头节点,重复的可能是多个。两层while循环。
8.4 树
二叉树的下一个节点,画图,分类讨论。
对称的二叉树,先序遍历和对称前序遍历序列来判断二叉树是不是对称的。
把二叉树打印成多行,bfs+队列。
按之字形打印二叉树,需要两个栈,一个存放当前层,一个存放下一层。
序列化二叉树,输出序列,然后根据输出的序列构建树。
二叉搜索树的第k个节点,中序遍历,递减k值。
数据流中的中位数,最大堆,最小堆实现。
8.5 栈和队列
滑动窗口的最大值,保存最大值和次大值,当后面的值大于这两个值,则更新。
8.6 回溯法

看了两天,大致看完了,留个笔记简单记录下,然后立个flag,过段日子附上github地址,估计会是python和c。

你可能感兴趣的:(剑指offer)