二维数组中的查找
注意到题目描述中并没有说明下一行的第一个数一定比上一行的最后一个数大。因此并不能先二分查找行再二分查找列。最稳妥的办法是乖乖二分查找每一行。时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
重建二叉树
已知前序和中序,重建二叉树。基本方法:递归
步骤:
- 假设当前前序序列的第一个为h,在中序找h,找到后计算左子树的节点个数和右子树的节点个数(注意,不要忘了算这两个值(面试的时候吃大亏))
- 根据上面的两个值确定递归的前序和中序序列。
旋转数组的最小数字
基本方法:二分
假设l为二分过程的左边界,r为右边界,由题意可知
- 如果中点 ⩾ \geqslant ⩾左边界,那么中点一定在未旋转的那部分;
- 如果中点 ⩽ \leqslant ⩽右边界,那么中点一定在旋转后的那部分;
什么时候结束二分查找呢?可以知道最终跳出二分查找的时候,一定有以下两种情况:
- l刚好为所求,也即中点刚好在原数组的最大值,调整后的l即为最小;
- r为原数组的最大值,那么r+1为所求。
两种情况都有左边界小于右边界
数值的整数次方
写这篇博客的时候刚好顿悟了快速幂运算,另外这道题还有一个坑:整数有可能为负数。
快速幂运算:把次数看成二进制。
- 最低位为1时,ret乘上当前的mul
- 每当次数向右移一位时,代表当前的mul要平方一次(想想8次方1000是通过平方三次得来的)
树的子结构
题意:给定两颗二叉树A,B,判断B是不是A的一部分。
思路:对A的每个节点s,判断B是否以s为头。
注意:只有在B的子节点存在时才进入子节点否则不进入,保持B为非空。