![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
对于剑指offer里面的题目进行解析
reachwang
这个作者很懒,什么都没留下…
展开
-
《剑指offer》:数组中只出现一次的数字
如果是只有一个数字,那么当然可以直接将全部元素进行异或,最后得出那个只出现一次的元素,原理就是一个元素和自己本身异或为0,且元素之间异或的顺序不影响最后的结果。那么如果有两个数字都出现了一次呢?可以使用HashMap来存储每个元素出现的次数,最后再进行寻找。但是我们还是要掌握一下如何使用异或来解决这个问题:首先我们还是先将所有元素进行异或,那么我们此时得到的结果是那两个元素异或的结果,加入结果...原创 2020-03-25 21:35:40 · 186 阅读 · 0 评论 -
《剑指offer》:机器人的运动范围
这个题目就是典型的深度优先遍历,或者说回溯法。就是在运动过程中记住访问过的状态,然后每到一个点如果点超出了边界直接return如果访问过这个点直接return如果点不满足我们的条件也return,最后如果满足则计数器加1,然后继续向上、下、左、右四个方向进行遍历。public class Solution { int count = 0; public int mov...原创 2020-03-25 17:40:16 · 125 阅读 · 0 评论 -
《剑指offer》:剪绳子
递归求解递归的方法就是我假设剪某一刀的时候,总是有n-1种选择动态规划动态规划的思路也很简答,就是每次剪绳子的时候,我们原创 2020-03-25 17:31:42 · 120 阅读 · 0 评论 -
《剑指offer》:数组中重复的数字
首先我们可以使用排序,然后再判断每两个相邻元素是否相等就行了。当然还可以使用一个HashSet来存储所有元素,当添加元素时判断Set中有没有,有则说明有重复的元素存在。简单解法因为题目规定的是数组长度为n,且数字都在0-n-1内,如果没有重复元素,则每个元素正好可以占据一个位置。那么我们可以让每个元素都待在自己应该在的位置上,如果一个位置上有两个元素需要占据,说明有重复的元素存在。我们先循...原创 2020-03-25 11:48:30 · 160 阅读 · 0 评论 -
《剑指offer》:二叉搜索树的后序遍历序列
这个题目刚开始不太会,虽然知道后序遍历的特点,也知道左子树都小于根节点、右子树都大于根节点,且根节点总是一个子树的最后一个节点,但还是无法下手的感觉。最后知道了怎么做,其实就是对于一个树,找到左右子树的分界点,然后分界点左边肯定是都比根节点小,因为我们就是利用左子树的特点去找分界点,那么真正要判断是否符合的就是右子树中的所有元素是不是都大于根节点即可。如果满足则递归判断左右子树,否则返回false...原创 2020-03-24 23:12:58 · 169 阅读 · 0 评论 -
《剑指offer》:字符流中第一个不重复的字符
这个题目的话其实是可以想到利用一个128大小数组来保存字符出现的次数,只是如果我们要找第一个时,每次都需要从头开始遍历,直到找到一个次数为1的则立即返回。那么我们可不可以简化这个遍历的过程?当我们遇到一个字符时,如果是第一次出现我们就将它放到一个队列中,如果不是第一次就不放到队列中了。当取第一个出现次数为1的字符时,我们去队列里拿,当然随着字符流的进行,队列里的字符不都是只出现一次了,那么我们就从...原创 2020-03-16 22:07:45 · 98 阅读 · 0 评论 -
《剑指offer》:删除链表中重复的结点
这个题目就是考察的边界条件,方法上没什么特别的。我们仍然要注意的是,遇到链表题目时,最好几个伪头结点。 public ListNode deleteDuplication(ListNode pHead) { if(pHead == null || pHead.next == null) //为null或者只有一个节点,直接返回 return ...原创 2020-03-16 21:34:49 · 82 阅读 · 0 评论 -
《剑指offer》:和为S的连续正数序列
这个题目就是维持一个窗口内的和,然后动态的向前滑动,直到右边界到达了目标和S为止,因为此时窗口内的和肯定是大于S,不管窗口有多小。代码如下: public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { ArrayList<ArrayList<Integer&...原创 2020-03-12 22:25:35 · 93 阅读 · 0 评论 -
《剑指offer》:平衡二叉树
这个题目按照我们一般的思路来说比较容易做,就是求出两个子树的长度,如果满足平衡的条件则递归的判断各自的子树,否则返回false,代码如下:public class Solution { public boolean IsBalanced_Solution(TreeNode root) { if (root == null) //为null,则返回true ...原创 2020-03-12 21:37:09 · 123 阅读 · 0 评论 -
《剑指offer》:连续子数组的最大和
这个题目就是典型的动态规划问题,也就是对于当前的元素num[i],如果它前面相邻的连续和flag[i-1]>0,那么它的最大连续和就是num[i]+flag[i-1];如果flag[i-1]<0,那么它的最大连续和就是本身num[i]。然后可以在更新完相应的flag[i]后,直接和result进行判断,取最大值。public class Solution { public i...原创 2020-03-12 00:24:39 · 82 阅读 · 0 评论 -
《剑指offer》:最小的K个数
这个题目的话,单纯看题目的名字就知道利用堆可以去解决。但是先讲一下另一种思路,就是将所有元素记录到自己的位置上,这样元素就会默认的从小到大进行排列,然后就可以找到了。代码如下: public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Intege...原创 2020-03-12 00:17:11 · 121 阅读 · 0 评论 -
《剑指offer》:数组中出现次数超过一半的数字
这个题目和leetcode169:多数元素类似。只是leetcode的题目保证数字总是存在的。我们知道这个题目可以使用哈希表来解决,只是在最坏的情况下时间复杂度可能是O(n),即每个元素都只出现一次。所以我们可以变一下思路。我们首先记住当前数量较多的元素和它出现的次数,当再次遇到此元素时次数+1,当遇到不一样的次数时就-1,而当更改完次数后如果变为了0,说明这个元素很少,那么我们就要更新当前数量...原创 2020-03-10 12:39:06 · 110 阅读 · 0 评论 -
《剑指offer》:之字形打印二叉树
也不难的题目,就是判断每层是奇数层还是偶数层,然后偶数层的时候要将顺序进行翻转即可。代码如下:class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList&l...原创 2020-03-09 23:28:50 · 80 阅读 · 0 评论 -
《剑指offer》:栈的压入、弹出序列
这个题目的话,我们的思路就是先将元素入栈,直到遇到出栈序列中的元素,那么此时我们就将满足的元素不停的出栈,最后判断栈是否为空即可。public class Solution { public boolean IsPopOrder(int [] pushA,int [] popA) { Stack<Integer> stack = new Stack<&g...原创 2020-03-09 23:07:42 · 106 阅读 · 0 评论 -
《剑指offer》:树的子结构
这个题目很明显的是递归,就是当两个指针指向两个根节点时,先判断根节点的值是否相等,如果相等的话那就递归判断左子树和右子树;否则的话就将root1变为它的左子树,看root2是不是它左子树的子结构,同样将root1变为它的右子树,看root2是不是它右子树的子结构。左右子树只要有一个满足就证明可行,代码如下:链接:https://www.nowcoder.com/questionTerminal/...原创 2020-03-09 18:07:33 · 110 阅读 · 0 评论 -
《剑指offer》:调整数组顺序使奇数位于偶数前面
首先这个题目有一个点要注意,就是不能更换同类型数据之间的相对顺序。如果没有这个限制的话,我们的代码可以使用两个指针分别从最左和最右向中间靠拢,然后遇到不符合的相互交换即可,代码如下:public class Solution { public void reOrderArray(int [] array) { int left = 0, right = array.len...原创 2020-03-08 22:02:54 · 106 阅读 · 0 评论 -
剑指offer:从上到下打印二叉树
普通的打印二叉树很简单,使用队列就可以解决。但是我做的这个题目是要将每一层的节点都存起来,而且不同层之间是分开存储的。其中有个问题就是我们如何去判断某一层是遍历完了,然后要到下一层了呢。我们可以这样解决,记住每层的个数,这样遍历上一层时我们知道上一层个数了就不会遍历下一层的节点;而遍历过程中也要把子节点加入到队列中,这个过程把下一层的节点数也要记住。看代码注释部分比较详细: public...原创 2020-02-25 17:43:28 · 78 阅读 · 0 评论 -
【剑指Offer】:二叉树的下一个结点
这个题目就是考察中序遍历,就是分三种情况:当结点右子树不为空时,则下一个一定是右子树的最左边的结点当结点是父节点的左子树时,那下一个一定是父节点当结点时父节点的右子树时,则顺着向上找,直到一个目标结点是它父节点的左子树,那下一个结点就是这个目标结点的父节点。代码如下:public class Solution { public TreeLinkNode GetNext(Tre...原创 2020-02-08 14:29:44 · 160 阅读 · 0 评论