总结的主要是剑指offer上对于我个人来说做过几次仍然需要思考一会才能做出来的题目。
1.重建二叉树
根据先序遍历和中序遍历重建二叉树,考察的是对二叉树的理解,二叉树先序遍历的第一个是根,在中序遍历中,左边的部分,是左子树,右边的部分是右子树。
利用递归去处理。
同样对于中序遍历和后序遍历也可以重建,思路就是最后面的后序遍历是根,然后在中序中找到根的位置,然后去重建。
先序和后序遍历不足以支撑重建二叉树。
2.旋转数组找最小值
对于一个非递增的数组,把数字循环的平移一些位置,寻找最小值,考察的是对于二分查找的理解,利用二分可以去解决,需要注意的是一种特殊情况是移动0个位置,一种特殊情况是第一个、最后一个和中间的都相等,这种情况下需要去循环遍历去寻找。
3.关于位运算,判断一个数字的二进制形式有几个1
a.使用过n&1和n>>1
在计算机中,移位运算的运算效率远远超过n/=2;不过要关注的问题是对于负数,因为移位会导致最左侧引入1,所以应该是得重点关注,可以用unsigned的来变成相同的再移位。
b.方法二是利用了一个性质即(n-1)&n相当于把n的最后一个1变成0
使用这种方式,操作几次就相当于有几个1
4.斐波那契数列的计算
斐波那契数列大概在小学就开始了解,到初中高中伴随了大多数人长大。具体的算fibi(n)是需要递归算到最后的,在这里的问题是在计算斐波那契的时候,如果直接使用递归会有很多重复的计算。
剑指offer的解决方法是不使用递归,而是反过来,从i=2,逐步计算到i=n。
其实还有另一种方法是使用一个vector,初始化都为-1,代表没计算过,然后在计算的过程中,如果不是-1,代表计算过,就直接用,否则就现算,然后填进去。
总结:今天主要是总结了二叉树的遍历特点、二分查找的使用题目、位运算的特点、在递归解决问题不方便的时候使用反过来的逐步计算过来。
其实斐波那契这个更像是动态规划。