一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点为根节点的子树的高度,通过判断左右子树的高度差是否大于1来判断是否为AVL树.其中计算子树的高度,利用了TreeDepth函数(具体可见<剑指offer(第二版)>P272).其中TreeDepth的思想如下: (1)计算一颗二叉树的高度,可以将该问题转化成求子树的高度+1.如果根节点只有左子树的…
剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列   题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型.   思路:其实就是把队列正常入栈,出栈的时候先把栈里的内容按顺序搬到另一个栈里,负负得正,这样再按顺序出栈的时候,就成了入栈前队列的顺序 package cn.edu.ujn.demo; import java.util.Stack; import org.junit.Test; public class Stack2Queue…
剑指Offer 按题号排序 面试题 3:数组中重复的数字 面试题 4:二维数组中的查找 面试题 5:替换空格 面试题 6:从头到尾打印链表 面试题 7:重建二叉树 面试题 8:二叉树的下一个节点 面试题 9:用两个栈实现队列 面试题 10:斐波那契数列 面试题 11:旋转数组中最小数字 面试题 12:矩阵中的路径 面试题 13:机器人的运动范围 面试题 14:剪绳子 面试题 15:二进制中1的个数 面试题 16:数值的整数次方 面试题 17:打印从1到最大的n位数 面试题 18:删除链表中的节点…
具体的题目大意和参考思路在此处不详述(见<剑指offer>),实质就是在中序遍历的过程中调整指针的指向,关于中序遍历有递归和非递归两种操作,所以此处也用了两种方法. 方法1(递归法): 代码如下: class Solution { public: TreeNode* Convert(TreeNode* pRootOfTree) { if(pRootOfTree == nullptr) return nullptr; TreeNode * pre = nullptr;//中序遍历中当前节点的前一…
一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释.而n个骰子的问题实质就是一个动态规划问题,所以文本主要从动态规划的角度来求解这个问题.首先该问题具备DP的两个特征:最优子结构性质和子问题的重叠性.具体的表现在:(1)n个骰子的点数依赖于n-1个骰子的点数,相当于在n-1个骰子点数的基础上再进行投掷.(2)求父问题的同时,需要多次利用子问题.由此定义状态转…
一.题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句 (即三元运算符,A? B : C) 二.题解 虽然求和问题本身很容易,但加上这么多限制条件的话,整个问题似乎就不那么简单了.<剑指offer>虽然给出了四种解决方法,但这四种方法都是基于C++的语言特性求解的,并不是通用的解法.所以,本文旨在给出通用的解法.首先,根据以上的限制条件,可以考虑的角度只有两种(个人看法)一个是递归,另一个是位运算.从位运算…
一.题目大意 给定一个数组A,对于数组A中的两个数字,如果排在前面的一个数字大于(必须大于,等于不算)后面的数字,则这两个数字组成一个逆序对.要求输出数组A中的逆序对的总数.例如,对于数组{7,5,6,4},一共存在5个逆序对,分别是(7,5).(7,6).(7,4).(5,4).(6,4). 注:根据题意可知,必须根据原数组中元素的相对顺序来统计,给定的数组时怎样,那就按照怎样的顺序. 二.思路分析 方法1:暴力破解.双重循环来判断出所有的逆序对数,时间复杂度为O(N^2),空间复杂度为O(1…
一.题目大意 给你一个数n,要求返回第n个丑数.其中,丑数的定义如下: 丑数是指只包含因子2.3和5的数.(数字1也是丑数,不过是个特例)引用<剑指offer>上的话来说,对于一个数M,如果M能被2整除,就连续除以2:若果能被3整除,就连续除以3:如果能被5整除,就连续除以5.如果最终的结果是1的话,那么M就是丑数,否则M不是丑数.以下是判断一个数是否为丑数的代码: bool IsUglyNumber(int num) { while(num % 2 == 0) num /= 2; while…
经过数月的努力,终于更完了牛客网的66道剑指offer,以下的顺序和大家在牛客网的顺序是一样的(排序也花了不少时间),希望对大家找工作/提高算法能力能起到些许帮助. 每天一道剑指offer-二维数组中的查找 https://mp.weixin.qq.com/s?__biz=MzI5MzYzMDAwNw==&mid=2247484262&idx=2&sn=83fb17338c606e2080fe75331f1528f7&chksm=ec6e7a3edb19f32867e399…
面试题10:斐波那契数列 题目要求: 求斐波那契数列的第n项的值.f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) n>1 思路:使用循环从下往上计算数列. 考点:考察对递归和循环的选择.使用递归的代码通常比循环简洁,但使用递归时要注意一下几点:1.函数调用的时间和空间消耗:2.递归中的重复计算:3.最严重的栈溢出.根据斐波那契数列递归形式定义很容易直接将代码写成递归,而这种方式有大量重复计算,效率很低. 解法比较: 解法3,4将问题数学化,借助数学工具的推导,从根本上减低时…