剑指offer

《剑指Offer》斐波那契数列(Java 实现)

北战南征 提交于 2020-01-30 22:34:32
文章目录 一、题目 1.1 题目描述 1.2 题目链接 二、实现代码 一、题目 1.1 题目描述   大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。   n<=39 1.2 题目链接 《牛客网》:斐波那契数列 二、实现代码 public class Solution { public int Fibonacci ( int n ) { int pre = 0 , cur = 1 ; for ( int i = 1 ; i < n ; i ++ ) { int temp = cur ; cur += pre ; pre = temp ; } return n == 0 ? pre : cur ; } } 来源: CSDN 作者: 杨小帆_ 链接: https://blog.csdn.net/qq_40697071/article/details/104118936

《剑指offer》扑克牌顺子(Java)

南笙酒味 提交于 2020-01-30 07:07:36
题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张 _ )…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。 做题思路 不得不说,牛客的题目描述写的真多…简单来说,题目就是这个样子的: 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,大小王可以看做任意数字。为了方便,大小王均以0来表示,并且假设这副牌中大小王均有两张。 我一开始没怎么好好读题,还想了如果给了五张牌以上的情况以及忽略了大小王无敌的情况… 首先是顺子嘛,肯定牌依次从小到大,况且大小王当0看,先排序,数值为0的先不管。找到下标不为零的index,然后开始检查看看有没有出现相邻的牌一样的情况

《剑指offer》树的子结构(Java)

十年热恋 提交于 2020-01-28 21:15:53
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) AC代码 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ //如果是空树,返回false public class Solution { public boolean HasSubtree ( TreeNode root1 , TreeNode root2 ) { if ( root1 == null || root2 == null ) return false ; if ( isPart ( root1 , root2 ) ) return true ; return HasSubtree ( root1 . left , root2 ) || HasSubtree ( root1 . right , root2 ) ; } public boolean isPart ( TreeNode r1 , TreeNode r2 ) { if ( r2 == null ) return true ; if ( r1 == null || ( r1 . val !=

《剑指offer》二叉树的深度(java)

本小妞迷上赌 提交于 2020-01-28 02:11:50
题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 AC代码 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public int TreeDepth ( TreeNode root ) { if ( root == null ) return 0 ; return Math . max ( TreeDepth ( root . left ) , TreeDepth ( root . right ) ) + 1 ; } } 来源: CSDN 作者: NayelyAA 链接: https://blog.csdn.net/weixin_40992982/article/details/104094999

《剑指offer》 二叉搜索树的第k个节点(java)

杀马特。学长 韩版系。学妹 提交于 2020-01-27 22:32:10
题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点。例如,(5,3,7,2,4,6,8)中,按结点数值大小顺序第三小结点的值为4。 解题思路 首先得搞明白二叉搜索树是个啥,下面是我找到的对于二叉搜索树的定义。 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 如果还不怎么明白二叉搜索树是啥,可以看看下面这张图,左节点<根节点<右节点。 题目是让寻找第k小的节点,那么就可以先遍历二叉搜索树的左子树的左节点,再遍历左子树的根节点然后是左子树的右节点;左子树完了,再遍历右子树,一直到找到第k小的节点。左-中-右的遍历顺序就是我们学的中序遍历,因此这个题可以用中序遍历来做。每遍历一个非空的节点,k–,一直到我们要找的那个节点为止,k正好是0。 这个题需要注意的是,k是变化的,一开始我直接用k当作变量传进参数去了,结果总是有点意外,于是整了一个成员变量。如果是C++实现的话,使用int &k传到函数里面就行了。 AC代码 /* public class TreeNode { int val = 0; TreeNode left = null;

《剑指offer》—— 二叉搜索树的后续遍历序列(Java)

久未见 提交于 2020-01-15 09:39:12
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { } } 思路: 先回顾了解一下二叉搜索树: 二叉搜索树(Binary Search Tree),(又:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的 二叉树 : 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为 二叉排序树 。 列如: 我们写一下上面这个二叉搜索树的后续遍历(左右根): 2,5,3,8,7,6 根据后续遍历规则以及二叉搜索树的规则,我们可以知道: 最后一个元素是根节点; 比最后一个元素大的,是树的右子树的元素;比最后一个树小的,是树的左子树的元素; 综上,我们可以将树划分成 [2,5,3] [8,7] [6] 其中 [6]是根结点, [2,5,3] 是左子树的后续遍历, [8,7] 是右子树的后续遍历。 我们可以将划分出来的 左子树 和 右子树 再继续按照上述方法划分; 一直到将元素划分完,划分过程中,如果没有违反二叉搜索树的规则

《剑指offer》 二维数组中的查找

我只是一个虾纸丫 提交于 2020-01-13 06:20:18
本题目是《剑指offer》中的题目 二维数组中的查找 题目:   在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路:   step1:首先取数组中右上角的数字   step2:判断如果等于目标值,则查找过程结束   step3:如果该数字大于目标值,剔除这个数字所在的列   step4:如果该数字小于目标值,剔除这个数在所在的行 C++ code class Solution { public: bool Find(int target, vector<vector<int> > array) { bool result = false; //返回结果值,默认为false,后期找到会更改此值 if (!array.empty()){ //审核数组是否为空,不为空进入,若为空,直接返回false int rows = array.size(); //提取二维数组的行数 int row = 0; //定义行迭代变量,从0开始迭代 int col = array[0].size()-1; //定义列迭代变量,从末尾开始迭代 while (row < rows && col >= 0){ //循环结束条件为行或者列超标 if (array

《剑指offer》-重建二叉树

百般思念 提交于 2019-12-24 03:24:00
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路:以下面的树结构进行前序和中序举例。 那么前序中的A就是最终的根节点,根据中序遍历规则,可以知道中序遍历中A左侧的节点都是A的左子树节点,A的右边就是A的右子树节点,见下图:在中序遍历中遍历,寻找‘A’节点,而A左侧的是左子树、A右侧的是右子树,而左子树的个数就是前序A后面的节点个数。 将A的左子树当做一个树结构,而重建这个树结构就是重复上一步的工作。 在中序中,寻找左子树的根节点B,重复上面的工作。循环就可以得到结果。 代码: /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { return

《剑指offer》算法题第七天

走远了吗. 提交于 2019-12-20 23:58:44
今日题目: 复杂链表的复制 二叉搜索树与双向链表 序列化二叉树 字符串的排序 1.复杂链表的复制 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路:这道题比较简单的做法是利用哈希表,把旧节点当成key,把新节点当成value,然后再来建立关系,时间和空间复杂度均为O(n)另外一种做法是将新生成的节点插入旧节点之间,然后再进行提取,时间复杂度为O(n),空间复杂度为O(1)。 代码如下: 1 //利用HashMap 2 public class Solution { 3 public RandomListNode Clone(RandomListNode pHead) 4 { 5 if(pHead == null) return null; 6 Map<RandomListNode, RandomListNode> map = new HashMap<RandomListNode, RandomListNode>(); 7 RandomListNode p = pHead; 8 while(p != null){ 9 map.put(p,new RandomListNode(p.label)); 10 p

《剑指offer》两个栈实现队列

a 夏天 提交于 2019-12-18 01:50:56
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 思路:栈是先进先出,队列是先进后出。那么两个栈需要实现的就是先进后出。比如输入ABCD,按顺序放在一个栈里面就是ABCD。见下图 在队列中对一个出来的是A,在栈中第一个出来的是D。而一个栈是先进先出ABCD,那么用另外一个栈做存储。A栈存着ABCD,弹出存到B栈中,就得到: 这样,B栈的弹出对一个就是A了,这样就用两个栈实现类队列。 来源: CSDN 作者: wangzhao93 链接: https://blog.csdn.net/wangzhao93/article/details/103587611