剑指offer
文章平均质量分 62
茶仇
这个作者很懒,什么都没留下…
展开
-
二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。1 2 8 92 4 9 124 7 8 136 8 11 15 思路:两种方法(1)定义两个游标,分别是列游标X,行游标Y,从左下角开始比较,如果大于目标数,Y--,小于目标数X++(如果从左上角比较的画有两条路径可以走,比较麻烦...原创 2018-07-01 11:55:37 · 112 阅读 · 0 评论 -
链表中倒数第K个节点
题目:输入一个链表,输出该链表中倒数第k个结点。思路:我们首先的想法是取链表中索引为长度-k-1的节点的个数,所以我们需要计算出链表的长度,这样的话就需要设一个计数器循环一遍链表,每循环一遍,计数值加一,取到计数值之后,我们再循环长度-k次,就可以得到倒数第k个节点,但是这个方法需要循环两遍,效率太低只循环一遍:我们可以设两个指针pre,after,当pre走K步的时候,让after指...原创 2018-07-22 00:02:49 · 76 阅读 · 0 评论 -
从上往下打印二叉树
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:这就是一个二叉树的层序遍历,借用一个队列来实现。将二叉树的根节点放在队列里,然后从队列里取节点作为当前节点,如果当前节点的左节点不为null,则将左节点入队,然后判断右节点,如果当前节点的右节点不为null则入队。举个栗子 首先,我们把1入队,然后从队列中拿1,把1放入集合中,1的左子树是...原创 2018-07-30 14:06:53 · 145 阅读 · 0 评论 -
二叉树镜像
题目:操作给定的二叉树,将其变换为源二叉树的镜像二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5思路:从根节点开始,...原创 2018-07-27 00:03:13 · 134 阅读 · 0 评论 -
反转链表
题目:输入一个链表,反转链表后,输出新链表的表头。时间限制:1秒思路:我首先想到的是用栈存储链表,然后再依次出栈然后返回头节点。但是,该方法太费时间,效率不高所以,我们循环采用只遍历一次就能反转的方法链表:1——>2——>3——>4——>5——6我们从头开始遍历,用p.next=head把1指向2的指针反转过来变成 1<——2 ...原创 2018-07-22 22:35:39 · 127 阅读 · 0 评论 -
顺时针打印矩阵
该题是参考剑指offer写的,如有错误,欢迎指正本文可能写的有些混乱了,需要结合代码看。另外本问有两个变量在此先声明一下columns :该二维数组的列数rows :该二维数组的行数原创 2018-07-27 16:41:35 · 73 阅读 · 0 评论 -
二叉树的后续遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:首先我们应该直到二叉搜索树的特点是根节点左边的所有元素都小于它,右边的所有元素都大于它, 这样我们只要使用递归的方法判断根节点的左边是否都小于它和右边是否都大于它就可以。 具体算法: ...原创 2018-07-31 14:27:11 · 1515 阅读 · 0 评论 -
包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路:首先可能到这道题你首先想到的是,循环求最小的输出就好了,但是,千万别忘记审题。 题目要求的是O(1),所以这个想法就不对了 那么有什么办法才能让它时间复杂度为O(1)呢? 我们使用一个辅助栈 思路是这样的...原创 2018-07-27 18:29:55 · 69 阅读 · 0 评论 -
字符串的排列
前言:可能写的思路有些混乱,如果有不懂的或我说错的,还请指教批评 ,本人还是很希望有批评的,因为写了这么多篇博客,没有评论,所以不知道自己的不足,希望能有评论来指正我的不足,来让我改正。题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。注意,这里还需要按字典序排...原创 2018-08-10 17:39:48 · 167 阅读 · 0 评论 -
数组中出现超过一半的次数
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0.思路一:把数组排好序,出现次数超过一半的数一定是排好序数组的中位数。然后取中位数,计算它出现的次数是否超过数组长度的一半。代码: public int MoreThanH...原创 2018-08-11 12:01:05 · 114 阅读 · 0 评论 -
最小的k个数
题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路一:利用快排的思想,随机从数组中取一个数X(我就取数组的第一个数了),如果定义一个游标 i=0 和 j=arr.length-1 ,先从j开始,向前走,如果下标为j的数字<x,那么下标为 j 的数换成X,X的位置换成下表为 j 的数,接着在从前往后走,如果碰...原创 2018-08-11 15:57:44 · 134 阅读 · 0 评论 -
树的子结构
本文的代码是参考牛客网上的解法,如有侵权请立即联系我。原创 2018-07-26 23:14:14 · 91 阅读 · 0 评论 -
栈的压入和弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:借助一个辅助栈,和一个弹出序列的索引index,将整数序列依次压入,每压入一个就将...原创 2018-07-30 12:29:23 · 166 阅读 · 0 评论 -
替换空格
题目:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:替换分为两种,(1)创建一个新的字符串(2)在原来的字符串上替换 第一种:把We Are Happy转换成字符数组,然后创建一个字符串str,将字符数组里的字符依次加到新建的字符串str后边,当出现空格的时候,将字符...原创 2018-07-01 13:57:44 · 140 阅读 · 1 评论 -
从尾到头打印链表
题目:输入一个链表,从尾到头打印链表每个节点的值。有两种方式:第一种,修改源原链表,把链表中链接节点的指针翻转过来。 第二种,不修改原链表,用栈。今天重点讲第二种,不改原链表。思路:遍历原链表,把值压入栈中,然后将栈中的值依次输出。代码: public class ListNode { int val; ListNode ne...原创 2018-07-02 17:48:15 · 101 阅读 · 0 评论 -
用两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:栈是先进后出,队列是先进先出,所以队列的出队顺序正好和栈的出栈顺序相反,好在题目让用两个栈来完成,所以将第一个栈的元素依次弹出压入栈二中,那么栈二的出栈顺序就是队列的出栈顺序。也就是说,当弹出时只要弹出stack2中的元素就可以了。综上所述:基本步骤就是当执行push方法的时候,往stack1中push...原创 2018-07-04 09:41:54 · 82 阅读 · 0 评论 -
求旋转数组中的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:第一、将零个元素搬到数组末尾{1,2,3,4,5},此时数组的第一个元素就是最小数字第二、将N个元素搬到数组末...原创 2018-07-04 12:19:47 · 143 阅读 · 1 评论 -
合并两个有序链表
题目:输入两个单调递增的链表l1,l2,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:思路很简单,我们可以用递归,定义一个结果链表,循环长度小的链表,如果l1的值小于l2的值,则把l1的值放在result中的后边,以此类推,但是,我们需要注意当输入l1和l2为null的情况,如果l1为null,l2!=null那么直接返回l2,如果l2为null,l1!=null那...原创 2018-07-23 11:49:20 · 95 阅读 · 0 评论 -
斐波那契数列
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39思路一:斐波那契额数列的公式为F(n)=F(n-1)+F(n-2); F(0)=0,F(1) = 1,所以根据公式可以知道F(2)=1; 由此公式我们很容易想到用递归 递归的思路如下 n<=0时,返回 0 n==1 || ...原创 2018-07-05 11:38:44 · 132 阅读 · 0 评论 -
青蛙跳台阶
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。该题其实是一个斐波那契数列思路:假设跳法是关于N的一个函数F(N),其实每一次的跳法都是跳一级台阶后,后边剩下的的n-1个台阶的跳法,加上跳2级台阶后,后边剩下的n-2级个台阶的跳法,即F(n)=F(n-1)+F(n-2),我们不难看出,这是一个斐波那契数列。代码:import java.util.Ar...原创 2018-07-05 12:12:03 · 91 阅读 · 0 评论 -
二进制中一的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。右移一位首先我们第一个想到的是将该整数和1做&运算如果等于1则计数加1,然后右移,直到右移后该数为0为止代码实现:public int NumberOf1(int n) { int count=0; while(n!=0) {if((n&1)==1) { count++; } ...原创 2018-07-12 16:07:09 · 197 阅读 · 0 评论 -
二叉树前序、中序、后序、层序遍历非递归方式
我们先回顾一下二叉树的遍历前序遍历:根——左——右ABDECFG中序遍历:左——根——右DBEAFCG后序遍历:左——右——根DEBFGCA层序遍历:从上到下从左到右ABCDEFG前序遍历思路:思路很简单,从根节点开始,输出节点的值,然后分别遍历该节点的左子树和右子树,具体实现是创建一个栈stack,用来存储节点,用while循环,如果当前节点不为nul...原创 2018-07-20 13:23:35 · 220 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数的前边
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变思路:首先我们会想到从前往后开始遍历,遇到偶数就把这个数后边的数向后移动,最后数组末尾剩下一个空的位置,将该数放入空位,这种想法很对,但是每遇到一个偶数就移动O(N)个数字,总时间复杂读为O(n^2),因此效率太低。那么...原创 2018-07-21 00:00:27 · 128 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:思路很简单,实现很困难,嗯,对实现很困难。 下面我来说一下思路, 有几个定义提前说一下,输入的整数定义为int target,节点定义...原创 2018-08-02 23:38:54 · 111 阅读 · 0 评论