算法:剑指offer
Hankzz
爱口袋妖怪/宝可梦的开发者。
展开
-
链表中倒数第k个结点(剑指offer)
链表中倒数第k个结点(剑指offer)输入一个链表,输出该链表中倒数第k个结点。解法:倒数第k个节点与最后一个节点相距k-1个节点。所以先定两个节点(first,second)都为头节点,让first节点先走k-1步,然后两个节点同时向后走,当first为尾节点时,second就是倒数第k个节点。同样这道题要注意一些特殊情况,这些特殊情况可能会导致程序出错,如1:链表为空;2:k=0;3:k&...原创 2019-03-30 19:32:21 · 128 阅读 · 0 评论 -
反转链表(剑指offer)
反转链表(剑指offer)输入一个链表,反转链表后,输出新链表的表头。解法:很明显,每次都要将当前结点和后续结点断开,与当前结点的next指向前驱结点,故每次先保存后续结点,当前结点next指向前驱,完成一个结点反转;然后前驱结点变更为当前结点,当前结点变为后续结点以便下一次反转public class Solution {public ListNode ReverseList(ListN...原创 2019-03-31 16:47:19 · 206 阅读 · 0 评论 -
合并两个排序的链表(剑指offer)
合并两个排序的链表(剑指offer)输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解法:如果直接在一个链表的基础上判断插入就太麻烦了,所以考虑换一种思路,从头开始建一个链表,每次取两个链表中的较小的进行插入到该新链表尾部,插入一个则那个链表next一次进行下次判断,直到某一条链表为空。具体做法:首先比较两个链表头节点,小的作为新链表头,被取出节点...原创 2019-03-31 17:42:31 · 185 阅读 · 0 评论 -
树的子结构(剑指offer)
树的子结构(剑指offer)输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解法:通过两个函数实现,一个函数1进行判断A、B根节点是否相同,另一个函数2则判断A、B子节点是否仍然相同。具体做法:函数1先判断头节点是否相同,相同执行函数2来判断子节点。若根节点不同或子节点不同,则将B根节点与A的左右子节点判断来继续寻找。 函数2中的具体操作就是,若A为...原创 2019-03-31 18:16:05 · 118 阅读 · 0 评论 -
二叉树的镜像(剑指offer)
二叉树的镜像(剑指offer)操作给定的二叉树,将其变换为源二叉树的镜像。解法:函数输入一个根节点,交换左右子树,以左右子节点递归该函数进而是所有子树交换。递归结束条件左右子树都为空,每次递归记得判断该节点是否为空。一般二叉树的问题基本上都是递归。。。public class Solution {public void Mirror(TreeNode root) { if(roo...原创 2019-03-31 18:38:42 · 95 阅读 · 0 评论 -
包含min函数的栈(剑指offer)
包含min函数的栈(剑指offer)定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。解法:通过两个栈来实现这个栈,一个是正常的数据栈data,另一个是存储最小数据的栈min,当push()的时候,如果min为空,min也直接push();接着每有一个数据入栈data,判断该数与min的栈顶,如果小于等于min.peek(),min也push...原创 2019-03-31 19:03:23 · 130 阅读 · 0 评论 -
栈的压入、弹出序列(剑指offer)
栈的压入、弹出序列(剑指offer)输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解法:思考一下,如果直接去判断很麻烦。那就可以模拟这个过程...原创 2019-04-01 21:49:30 · 111 阅读 · 0 评论 -
从上往下打印二叉树(剑指offer)
从上往下打印二叉树(剑指offer)从上往下打印出二叉树的每个节点,同层节点从左至右打印。解法:一般二叉树遍历(前序,中序,后序)都是用递归来完成的,但从上到下每层打印就要换种思路了。可以使用队列来实现,首先offer()入头节点,之后循环每次poll()出一个节点时,把该节点的左右子节点加入到队列中,因为队列先进先出,所以就是从上到下,同层左至右依次输入输出队列,直到队列为空结束。impo...原创 2019-04-03 14:09:46 · 96 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列(剑指offer)输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解法:二叉搜索树就是左子树所有节点小于根节点,所有右子树大于根节点,而后续遍历则又是左右中(故数组一段全小于最后一个,后一段全大于),故数组最后一个数字是根节点。所以进行循环,找到第一个大于该根节点的节点,再在该节点...原创 2019-04-03 15:10:58 · 125 阅读 · 0 评论 -
二叉树中和为某一值的路径(剑指offer)
二叉树中和为某一值的路径(剑指offer)输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)解...原创 2019-04-03 15:53:13 · 794 阅读 · 0 评论 -
复杂链表的复制(剑指offer)
复杂链表的复制(剑指offer)输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解法1:通过HashMap,分成两个阶段,第一各阶段就是通过next复制一条普通的链表,每次插入一个节点时,HashMap通过put原链表节点和该节点...原创 2019-04-03 18:17:24 · 115 阅读 · 0 评论 -
二叉搜索树与双向链表(剑指offer)
二叉搜索树与双向链表(剑指offer)输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解法:二叉搜索树就是左子树都小于根节点,右子树大于根节点,所以思路就是中序遍历(左中右)就是已经是从小到大的顺序的,可以设置一个前驱节点prenode,初始为null,通过中序遍历,每遍历一个节点,该节点left为prenode,prenode...原创 2019-04-03 18:23:51 · 119 阅读 · 0 评论 -
二维数组查找(剑指offer)
二维数组中的查找(剑指offer):在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解法一:因为每一行都是递增的,直接对每一行进行二分查找即可。public class Solution {public boolean Find(int targe...原创 2019-03-08 17:29:21 · 93 阅读 · 0 评论 -
替换空格(剑指offer)
替换空格(剑指offer)请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解法:首先计算出有多少个空格从而得出新字符串的长度,设定两个标志分别指向原字符串结尾和新字符串结尾,老标志从后往前移动,依次从老字符串结尾一个一个把字符复制给新字符串,复制一次两个标志都向前移动一个;当碰到空格时...原创 2019-03-08 17:46:22 · 116 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面(剑指offer)
调整数组顺序使奇数位于偶数前面(剑指offer)输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解法:插入排序的思想,先假设第一个已经排好序了,每次外循环是使一个数进行排序;内循环排序具体,这里就是如果前一个数为奇数则不用排;如果前一个数为偶数该数也为偶数不用排,如果前一个数...原创 2019-03-30 19:08:58 · 158 阅读 · 0 评论 -
数组的整数次方(剑指offer)
数组的整数次方(剑指offer)给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解法:只需要注意一下exponent的正负值即可public class Solution {public double Power(double base, int exponent) { double result = 1.0; ...原创 2019-03-30 18:43:35 · 181 阅读 · 0 评论 -
二进制中的1的个数(剑指offer)
二进制中的1的个数(剑指offer)输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解法1:将该数与temp(temp起始为1)进行与运算(就是最低位与1与)结果不为0,则该位为1;结果为0,则该位为0;temp进行左移一位,进而判断该数的下一位;直到判断完该数的所有位即temp左移至结果为0的时候结束。public class Solution {public int N...原创 2019-03-30 18:24:57 · 124 阅读 · 0 评论 -
矩形覆盖(剑指offer)
矩形覆盖(剑指offer)我们可以用2×1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2×1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解法:类似于青蛙跳,要使得长2被覆盖,第一次只能是横着放一个或竖着放两个所以:f(n) = f(n-1) + f(n-2).public class Solution {public int RectCover(int target) {...原创 2019-03-30 17:58:53 · 68 阅读 · 0 评论 -
变态跳台阶(剑指offer
变态跳台阶(剑指offer)一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解法:思路和前一题一样,把跳n级的问题转换为第一次跳多少级得出的跳法相加;就是跳n级台阶,第一次可以是1,2…n,所以跳法:f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(1) +1;f(n-1) = f(n-2) + f...原创 2019-03-30 17:42:34 · 75 阅读 · 0 评论 -
跳台阶(剑指offer)
跳台阶(剑指offer)一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解法:跳n级为f(n),从跳上n级台阶的第一次跳来思考,第一次可以是跳了1级,如果跳了1级则后面的跳法就是f(n-1);第一次也可以跳了两级,则后面的跳法就是f(n-2);很明显结论就是f(n) = f(n-1) + f(n-2).public cla...原创 2019-03-30 17:23:21 · 106 阅读 · 0 评论 -
斐波那契数列(剑指offer)
斐波那契数列(剑指offer)大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39 ,f(n) = f(n-2) + f(n-1).解法1:递归就行public class Solution {public int Fibonacci(int n) { 递归 if(n==0){ retur...原创 2019-03-30 17:05:23 · 85 阅读 · 0 评论 -
旋转数组的最小数字(剑指offer)
旋转数组的最小数字(剑指offer)把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解法一:直接对数组排序就行。。。但这样时间复杂度最小也是O(nlogn),不讨论了。...原创 2019-03-08 18:43:46 · 97 阅读 · 0 评论 -
用两个栈实现队列(剑指offer)
用两个栈实现队列(剑指offer)用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解法:栈先进后出,队列先进先出。stack1用于入,stack2用于出。所以每次push操作时,stack1入栈;pop操作时,先判断stack2是否为空,为空stack1全部出栈stack2来入,再stack2出栈,如果stack2不为空,则直接stack2出栈;这样就完美实...原创 2019-03-08 18:22:51 · 101 阅读 · 0 评论 -
重建二叉树(剑指offer)
重建二叉树(剑指offer)输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解法:根据前序遍历和中序遍历找到根节点,从而获取左、右子树的前序遍历和中序遍历,递归进而获取左右子树的根节点,一直递归直到没有子树不...原创 2019-03-08 18:09:45 · 72 阅读 · 0 评论 -
从尾到头打印链表(剑指offer)
从尾到头打印链表(剑指offer)输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解法:直接创一个栈,遍历链表。。。import java.util.ArrayList;import java.util.Stack;public class Solution {public ArrayList<Integer> printListFromTailToHead...原创 2019-03-08 17:54:31 · 217 阅读 · 0 评论 -
数组中出现次数超过一半的数字(剑指offer)
数组中出现次数超过一半的数字(剑指offer)数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解法1:遍历加入到HashMap中,再遍历一遍进行判断即可解法2:一个数超过一半则他比其他所有数个数的和都大,那么我们就可以标记第一个值,...原创 2019-04-03 18:35:24 · 90 阅读 · 0 评论