
剑指offer
ACodeBird
一只程序鸟,每天飞高一点点
展开
-
日常刷题之剑指offer:11.旋转数组的最小数字
一、问题描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 二、解题思路: 1.利用二分查找的思想,每次将旋转数组分成两半,其中一半是有序的,一半是旋转数组,然后再对旋转数组依次类推,最后可以得到最小值。关键是如何确定那一半是旋转数组,因为数组是非递减排序的,所以有序的一半的第一个原创 2020-08-31 18:04:27 · 171 阅读 · 0 评论 -
日常刷题之剑指offer:10.4.变态跳台阶
一、问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 二、解题思路: 1.青蛙可以跳上n级,根据上一题跳台阶的分析,本题跳上n级台阶就是跳上前n-1个台阶的和加1,为什么要加1,因为青蛙可以跳上n级台阶啊,所以最后需要加1。初始条件还是一样的,只不过这里的dp[i]存的是跳上i级台阶跳法的和。 2.代码实现 public class Solution { public int JumpFloorII(int target) {原创 2020-08-31 15:39:32 · 157 阅读 · 0 评论 -
日常刷题之剑指offer:10.3.跳台阶
一、问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 二、解题思路: 1.青蛙每次跳有两种选择,要么跳1级台阶,要么跳2级台阶,那一个n级的台阶的总共跳法就是n-1级台阶的跳法加上n-2台阶的跳法,即f(n) = f(n-1) + f(n-2),(n> 2)动态规划最主要的是找出初始条件,此处的初始条件就是n=1时只有1种跳法,n=2时只有两种跳法 2.代码实现 public class Solution { pu原创 2020-08-31 15:16:07 · 154 阅读 · 0 评论 -
日常刷题之剑指offer:10.2.矩形覆盖
一、问题描述:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 二、解题思路 1.此题同样是考斐波那契数列,有一点点不同 2.同样可以使用递归和动态规划实现:下面只给出动态规划的代码实现 public class Solution { public int RectCover(int target) { if(target <= 2) return ta原创 2020-08-31 15:06:26 · 148 阅读 · 0 评论 -
日常刷题之剑指offer:10.1.斐波那契数列
一、问题描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)n<=39。 二、解题思路: 1.斐波那契数列规律:f(0) = 0,f(1) = 1,f(n) = f(n-1) + f(n-2),(n>1); 2.递归(自顶向下计算):递归很容易就可以算出,重要的是找到递归的出口,此处递归出口非常明显,就是当n == 0 || n == 1的时候 2.1.代码实现 public class Solution { public原创 2020-08-31 12:27:19 · 183 阅读 · 1 评论 -
日程刷题之剑指offer:9.用两个栈实现队列
一、题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 二、解题思路: 1.栈的特性是先进先出,队列的特性是先进先出。那么我们就可以将两个栈分为进栈和出栈,进栈用于实现队列Push操作,出栈用于实现队列Pop操作。为什么呢?数据执行Push操作时将数据放到进栈,那么进栈的输出结果就是队列的逆序,如果我们再Pop操作的时候将进栈的数据再放到出栈,又倒了一次顺序,这时出栈的输出结构将与队列一致,每次出栈输出数据后需要将数据重新一致进栈,这样后序Push操作才能保证顺序原创 2020-08-31 11:25:31 · 206 阅读 · 0 评论 -
日常刷题之剑指offer:8.二叉树的下一个结点
一、问题描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 二、解题思路: 1.给定的结点有两种情况:第一是给定结点有右子树,则该结点的下一个结点是右子树的最左结点;第二种是给定结点没有右子树,则该结点的下一个节点是向上找第一个左连接包含该结点祖先的结点(第二种是不是有点蒙,画一下图推演一下就知道了) 1.1.当给定结点是7时,按照中序遍历他的下一个结点是2,结点2刚好是左孩子包含7的祖先结点4(或者结点7)的第一个左原创 2020-08-26 18:28:18 · 145 阅读 · 0 评论 -
日常刷题之剑指offer:7.重建二叉树
一、问题描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 二、解题思路: 1.知识储备前提 1.1.树的四种遍历方式(所谓的前序、中序、后序指的是根节点的访问顺序) 1.1.1.前序遍历:先访问根节点,在前序遍历左子树,最后前序遍历右子树 1.1.2.中序遍历:先中序遍历左子树,再访问根节点,最后中序遍历右子树 1.原创 2020-08-26 17:28:53 · 152 阅读 · 0 评论 -
日常刷题之剑指offer:6.从头到尾打印链表
一、问题描述:输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 二、解题思路: 1.递归解法,先输出当前链表的后续链表next,再输出当前节点 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> list = new ArrayList<>(); if(listNode != null) { list.ad原创 2020-08-25 17:25:18 · 159 阅读 · 0 评论 -
日常刷题之剑指offer:5.替换空格
一、问题描述:将一个字符串中的空格替换成 “%20”。 二、解题思路: 1.直接使用String的replace(" “,”%20"),感觉直接调API没锻炼到解题能力 public String replaceSpace(StringBuffer str) { return str.toString().replace(" ","%20"); } 2.不调用API的解法:先遍历字符串,发现空格就在字符串后面添加两个空格,这样遍历完就可以得到替换后的字符串长度。然后从旧字符串长度和新字符串长度往前遍历,原创 2020-08-25 17:17:47 · 140 阅读 · 0 评论 -
日常刷题之剑指offer:4.二维数组中的查找
一、问题描述:给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。 二、解题思路: 1.注意题干:每一行从左到右是递增的,每一列从上到下是递增的,所以从右上角开始比较,target小于array[i][j]则j–,target大于array[i][j]则i++ public boolean Find(int target, int [][] array) { int i = 0; int j = array[0].length - 1;原创 2020-08-25 11:58:20 · 156 阅读 · 0 评论 -
日常刷题之剑指offer:3.数组中重复的数字
一、题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 二、解题思路 1.暴力法:直接排序,然后看相邻两个数是否相同,相同则为重复(此题暴力无法AC) 2.时间复杂度和空间复杂度均为O(n),用一个map来将数组的值作为key存储,一次for循环即可,每次先判断map.contains原创 2020-08-25 11:36:48 · 196 阅读 · 0 评论