随笔分类 -  剑指Offer

摘要:【思路】因为二叉搜索树的中序遍历就是递增排列的,所以只要在中序遍历时将每个结点放入vector中,再分别为每个结点的左右指针赋值即可。 阅读全文
posted @ 2017-03-03 15:24 Strawberry丶 阅读(151) 评论(0) 推荐(0) 编辑
摘要:1 /* 2 struct RandomListNode { 3 int label; 4 struct RandomListNode *next, *random; 5 RandomListNode(int x) : 6 label(x), next(NULL), random(NULL) { 7 } 8 }; 9 *... 阅读全文
posted @ 2017-03-03 15:01 Strawberry丶 阅读(223) 评论(0) 推荐(0) 编辑
摘要:【思路】 ·递归先序遍历树, 把结点加入路径。 ·若该结点是叶子结点则比较当前路径和是否等于期待和。 ·弹出结点,每一轮递归返回到父结点时,当前路径也应该回退一个结点 注:路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 阅读全文
posted @ 2017-03-02 15:10 Strawberry丶 阅读(166) 评论(0) 推荐(0) 编辑
摘要:【思路】BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。下面是在讨论中看到的一份代码,已学习到。 阅读全文
posted @ 2017-03-01 11:55 Strawberry丶 阅读(116) 评论(0) 推荐(0) 编辑
摘要:【思路】广度优先遍历,队列实现 阅读全文
posted @ 2017-02-28 20:27 Strawberry丶 阅读(191) 评论(0) 推荐(0) 编辑
摘要:题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是 阅读全文
posted @ 2017-02-28 20:11 Strawberry丶 阅读(196) 评论(0) 推荐(0) 编辑
摘要:题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 【思路1】两个栈Stack和Min,Stack为当前栈中元素,Min为与Stack中元素一一对应的当前栈最小值。 【思路2】使用pair<int,int>从而实现只用一个栈来操作 阅读全文
posted @ 2017-02-28 19:42 Strawberry丶 阅读(164) 评论(0) 推荐(0) 编辑
摘要:【思路】本题关键在于 右->左 和 下->上 两个循环体中的判断条件,即判断是否重复打印。 阅读全文
posted @ 2017-02-28 17:09 Strawberry丶 阅读(199) 评论(0) 推荐(0) 编辑
摘要:题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 【思路1】递归,左右孩子交换再分别递归左右子树 【思路2】非递归,栈实现 阅读全文
posted @ 2017-02-27 20:10 Strawberry丶 阅读(214) 评论(0) 推荐(0) 编辑
摘要:题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 【思路】要查找树A中是否存在和树B结构一样的子树,可以分成两步: 1.第一步在树A中找到和B的根节点的值一样的结点R;即当前树A包含子树B,HasSubtree(...) 2.第二步再判断树A中以R 阅读全文
posted @ 2017-02-27 19:23 Strawberry丶 阅读(195) 评论(0) 推荐(0) 编辑
摘要:题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 【思路1】递归 【思路2】非递归,新建一个链表并保存头结点,将原来两个链表进行比较按顺序插入到新链表中,最后将有剩余的链表直接接上。 阅读全文
posted @ 2017-02-27 18:40 Strawberry丶 阅读(186) 评论(0) 推荐(0) 编辑
摘要:题目描述 输入一个链表,反转链表后,输出链表的所有元素。 【思路1】三个指针在链表上同时滑动。 【思路2】头插法 阅读全文
posted @ 2017-02-27 16:38 Strawberry丶 阅读(120) 评论(0) 推荐(0) 编辑
摘要:【思路】利用两个相隔为k-1个结点的指针进行遍历,当后一个指针移到末尾时,前一个指针就是要求的结点。 阅读全文
posted @ 2017-02-27 16:02 Strawberry丶 阅读(152) 评论(0) 推荐(0) 编辑
摘要:题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 【思路1】用2n的空间换取n的时间复杂度,另外开一个数组,先将奇数存入再将偶数存入 【思路2】 * 1.要想保证原有 阅读全文
posted @ 2017-02-27 14:31 Strawberry丶 阅读(146) 评论(0) 推荐(0) 编辑
摘要:【思路1】递归 1 class Solution { 2 public: 3 double Power(double base, int exponent) { 4 if(exponent < 0){ 5 base = 1/base; 6 exponent = -exponent; 7 } 8 if 阅读全文
posted @ 2017-02-27 12:43 Strawberry丶 阅读(162) 评论(0) 推荐(0) 编辑
摘要:【思路】如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。 举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变 阅读全文
posted @ 2017-02-24 16:05 Strawberry丶 阅读(124) 评论(0) 推荐(0) 编辑
摘要:题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 【思路】可归纳得出结论: f(n) = f(n-1) + f(n-2), (n > 2)。 另外: (1)1 * 3方块 覆 盖3*n区域:f(n) = f(n 阅读全文
posted @ 2017-02-24 15:27 Strawberry丶 阅读(152) 评论(0) 推荐(0) 编辑
摘要:题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 【思路1】每个台阶都有跳与不跳两种可能性(最后一个台阶除外),最后一个台阶必须跳。所以共用2^(n-1)中情况。 【思路2】 关于本题,前提是n个台阶会有一次n阶的跳法。分析如下 阅读全文
posted @ 2017-02-24 03:44 Strawberry丶 阅读(188) 评论(0) 推荐(0) 编辑
摘要:题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 【思路】与斐波那契数列类似 阅读全文
posted @ 2017-02-24 03:23 Strawberry丶 阅读(143) 评论(0) 推荐(0) 编辑
摘要:1 class Solution { 2 public: 3 int Fibonacci(int n) { 4 int res[40] = {0}; 5 res[0] = 1; 6 res[1] = 1; 7 for(int i = 2;i < n;i ++){ 8 res[i] = ... 阅读全文
posted @ 2017-02-24 03:16 Strawberry丶 阅读(131) 评论(0) 推荐(0) 编辑