剑指offer
我是nefu小白
这个作者很懒,什么都没留下…
展开
-
剑指offer13. 机器人的运动范围
剑指offer13. 机器人的运动范围思路:与剑指offer第十二题相似,用的是回溯法,首先判断该位置是否满足矩阵要求,是否满足题目要求(行坐标和列坐标的数位之和大于k的格子)以及该位置是否未被访问(设置一个boolean的矩阵来记录该位置是否被访问且被计数了),如果上述条件均满足就count加1并判断它的上下左右四个位置是否也满足条件。代码:class Solution { public int movingCount(int m, int n, int k) { //前提原创 2021-07-24 15:21:07 · 76 阅读 · 0 评论 -
剑指offer 12. 矩阵中的路径
剑指offer 12. 矩阵中的路径思路:这个题是一个用回溯法解决的经典题。这个题就是遍历该数组,找到第一个符合ch与word第一个字符i匹配后,就在ch处的上下左右再寻找与i下一个位置相匹配的字符。找到了继续上述操作,没找到就说明这个路径是不通的,需要回溯到上一个ch,然后继续上述操作比较。这枚举出了所有路径,只要有路径就返回true。代码:class Solution { public boolean exist(char[][] board, String word) {原创 2021-07-01 10:07:05 · 75 阅读 · 0 评论 -
剑指Offer11.旋转数组的最小数字
剑指Offer11.旋转数组的最小数字1.暴力法:我们可以直接遍历这个数组,显然这个方法的时间复杂度是O(n)。我们看到旋转数组的特点就是,可以划分为两个排序好的数组,最小的元素正是这两个数组的分界线,因此我们可以不用完全遍历完这个数组。class Solution { public int minArray(int[] numbers) { int min = numbers[0]; for (int i = 1; i < numbers.length;原创 2021-06-29 18:58:51 · 56 阅读 · 0 评论 -
剑指offer07.重建二叉树
重建二叉树我们先弄懂一下为什么知道了先序序列和中序序列就能够完成二叉树的重建。二叉树前序遍历的顺序为:先遍历根节点;随后递归地遍历左子树;最后递归地遍历右子树。二叉树中序遍历的顺序为:先递归地遍历左子树;随后遍历根节点;最后递归地遍历右子树。所以说先序序列的第一个就是我们的根节点我们依据下面的例子画图来理解二叉树重建的过程:前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]从上面我们知道了二叉树的重建过程,我们发现每一个二叉原创 2021-06-28 21:57:35 · 76 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
从尾到头打印链表方法1:利用栈,先把链表中的元素,依次放入栈中,并得到多少个数值,从而定义一个数组,然后依次出栈保存到数组中。我们熟悉一下栈中的基本方法:boolean empty() 测试堆栈是否为空Object peek( ) 查看堆栈顶部的对象,但不从堆栈中移除它。Object pop( ) 移除堆栈顶部的对象,并作为此函数的值返回该对象。Object push(Object element) 把项压入堆栈顶部。int size() 返回栈的大小int search(Object原创 2021-06-24 18:00:55 · 61 阅读 · 2 评论 -
剑指 Offer 05. 替换空格
剑指 Offer 05. 替换空格替换空格思路:new一个StringBuilder,遍历字符串,遇到空格就在new的StringBuilder加%20,不是空格就加原来的值。这里就会遇到一个面试题:说一说String和StringBuffer有什么区别参考答案String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过St原创 2021-06-24 17:01:37 · 82 阅读 · 0 评论 -
剑指offer 04 二维数组中的查找
剑指offer 04 二维数组中的查找二维数组中的查找思路:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]这个题可以直接用暴力法找出目标值。但从上面的示例可以看出,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。如果我们从最左下角找,也就是上述示例的18。如果目标值大于该值原创 2021-06-24 16:30:04 · 55 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
数组中重复的数字方法一利用哈希表来解决问题,从头到尾扫描数组的每个数字,每扫描一个数字,多可以用O(1)的时间来判断是否已经包含了该数。如果哈希表中没有这个数,就把这个数加入哈希表中,有的话返回结果,这种算法的时间复杂度是O(n)但他的空间复杂度是O(n),因为他需要消耗一个大小为O(n)的哈希表。代码:import java.util.*;class Solution { public int findRepeatNumber(int[] nums) { HashSet&原创 2021-06-24 10:53:41 · 57 阅读 · 0 评论 -
小白教你数组中出现次数超过一半的数字
数组中出现次数超过一半的数字题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。你可以假设数组是非空的,并且给定的数组总是存在多数元素。1<=数组长度<=50000示例1:输入:[1,2,3,2,2,2,5,4,2]输出:2示例2:输入:[3,3,3,3,2,2,2]输出:3示例3:输入:[1]输出:1题目链接:数组中出现次原创 2021-06-22 00:07:25 · 110 阅读 · 1 评论 -
小白教你斐波那契数列
斐波那契数列题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n≤39示例:输入:4返回值:3思路:首先我们必须知道斐波那契数列。斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)这道题与青蛙跳解题的题解题思路一样。青蛙跳阶梯这道题直接看代码,更容易理解。代码:public class Solution { pu原创 2021-06-18 22:29:36 · 199 阅读 · 0 评论 -
小白教你用两个栈实现队列
用两个栈实现队列题目描述:用两个栈来实现一个队列,分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。示例1:输入:[“PSH1”,“PSH2”,“POP”,“POP”]返回:1,2解析:“PSH1”:代表将1插入队列尾部“PSH2”:代表将2插入队列尾部"POP“:代表删除一个元素,先进先出=>返回1"POP“:代表删除一个元素,先进先出=>返回2示例2:输入:[“P原创 2021-06-20 12:54:19 · 428 阅读 · 0 评论 -
二叉树的镜像
剑指offer之——二叉树的镜像题目描述:思路:二叉树的镜像这个题较为简单,只需要设法把每个节点的左右结点互换,遍历完后的结果就是二叉树的镜像。本文将利用递归和非递归的两种方法给大家表述详细过程。递归:①直接利用递归交换左右节点②用一个temp结点存储当前结点的左节点③当前结点的左节点等于当前节点的右结点④当前的右结点等于temp结点实现左右结点的互换⑤递归当前节点的左结点⑥递归当前节点的右结点利用队列实现层次遍历:①利用队列实现层次遍历②每次poll()出来的结点,将此结点的左原创 2021-06-04 14:58:13 · 963 阅读 · 0 评论 -
序列化二叉树
剑指offer之——序列化二叉树题目描述:请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的原创 2021-06-03 11:07:41 · 76 阅读 · 0 评论 -
二叉树的下一个结点
剑指offer之——二叉树的下一个结点思路1:①:通过给定的结点找出该树的根结点。②:中序遍历该树并存储在数组中。③:最后依次读取数组中的结点,找出二叉树的下一个结点。/*public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) {原创 2021-05-21 00:11:11 · 103 阅读 · 0 评论 -
删除链表中的重复结点
删除链表中的重复结点思路:①扫描一遍链表,将重复的结点存储在set容器中。②再次扫描链表,如果结点值存在于set容器中,则把这个结点删除。/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/import java.util.HashSet;public class Solution { pu原创 2021-05-17 17:03:38 · 175 阅读 · 0 评论 -
链表中环的入口结点
剑指offer——链表中环的入口结点题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:①解决这个问题的第一步是如何确定链中是否有环设置两个指针,一个Fast快指针,一个Slow慢指针,Fast指针一次走两步,Slow指针一次走一步。如果Fast指针能追上Slow指针,说明链中有环。如果Fast走到末位还未追上Slow指针,则链中没有环。注意:如果链中有环,Fast指针与Slow指针相遇必然在环内相遇②确定链中有环后,只需把其中一指针放在重新放在链表头,另一原创 2021-05-15 07:50:00 · 121 阅读 · 0 评论