![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
smallone233
这个作者很懒,什么都没留下…
展开
-
剑指offer-连续子数组的最大值
题目描述:给你一个数组,找到和最大的连续子数组思路:本题是典型的动态规划题目设置一个curSum来保存当前和,用res来保存最大的和也就是结果。 可以这么想,当前的这个数要不要加到curSum中,找这个连续最大的子数组,就像一个开口向下的抛物线,我要做得就是得到x轴以上的那部分面积,从而达到最大值。如果curSum为负数了,说明它已经走到了x轴的下方,同时也把前面为正的面积给抵消了,所以这时候我们...原创 2018-06-05 19:40:43 · 135 阅读 · 0 评论 -
**剑指offer-整数中1出现的次数
题目描述:给你一个整数,计算出从[1,n],的所有包含1的数字的个数思路:分割这个数,按照1,10,100的递增,可以用一个循环实现为什么要分割,为了分开计算1出现的次数,每次定位到某一个位上面总用有三种情况:(1)假设一个数33452, 假设定位到100,那么a=33452/100=334,b=33452%100=52。百位的数是大于1的,先假设定位这个百位就是1了,百位因为只有一种可能是1,然...原创 2018-06-05 21:00:23 · 83 阅读 · 0 评论 -
*剑指offer-树的子结构
题目简述:输入两个树的根节点 root1 root2,判断root2是不是root1的子树思路:首先是要找到和root2相等的那个节点,怎么找? 递归的找,先设置一个res作为结果返回值,初始为false,按中序遍历递归来找。首先root1和root2都不为null的情况下再进行中序遍历,先判断root1.val==root2.val? ,是的话就res=自己构建的一个函数,这个函数判断root1...原创 2018-05-30 15:03:54 · 107 阅读 · 0 评论 -
剑指offer-两个链表的第一个公共节点
题目描述:给你两个链表,找出他们第一个公共节点思路: 公共节点就是 一样 的两个节点,若这两个节点一样,那么这个节点之后的节点也都一样。但两个链表的长度谁长谁短不知道,所以应该先判断长短,让后让长的链表走一个长短差对齐尾部,因为如果有公共节点,那么公共节点到尾巴的所有节点都一样。 所以可以从这个点相互比较,第一个一样的节点就是答案java程序:/*public class ListNode { ...原创 2018-06-13 14:42:05 · 66 阅读 · 0 评论 -
剑指offer-数字再排序数组中出现的次数
题目描述:给你一个排序了的数组 和一个数 找出这个数在这个数组中出现的次数思路:若直接循环遍历的话 复杂度为O(n) 但因为是排好序的 所以直接用二分查找 找到这个数出现的起始位置,然后相减 就可以得到他出现的次数了 时间复杂度为logn java程序:public class Solution { public int GetNumberOfK(int [] array , int k)...原创 2018-06-13 14:45:06 · 64 阅读 · 0 评论 -
剑指offer-二叉树深度
题目描述:获得一个二叉树的最大深度思路:递归中序遍历,设置两个全局变量,count记录当前层数,maxCount记录最大count,之后就是递归的过程了 最后返回最大值java程序:/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeN...原创 2018-06-13 15:03:07 · 110 阅读 · 0 评论 -
*剑指offer-顺时针打印矩阵
题目描述:给你一个二维数组,顺时针打印这个数组思路:每次打印最外围一圈,最难的是条件的判断,特殊情况,如果是1*1,1*2,2*1这三种情况得考虑如何处理。先算出这个矩阵有多少圈,再循环打印圈从左往右,起始位置为每个圈的最左上角,一直打印到最右上角从上往下,起始位置为最右上角的下面那个位置,一直打印到右下角从右往左,先判断是否有两行及以上,若只有一行则会是重复打印,起始位置为最右下角的左边那个位置...原创 2018-05-30 16:21:24 · 117 阅读 · 0 评论 -
*剑指offer-包含min函数的栈
题目描述:实现一个栈的功能,包含min函数,就是能查询到栈里面的最小值是多少思路:定义一个数组element来存放数,定义一个minStack来存放每个元素对应的最小值,min记录当前最小值,用size来表明当前栈大小,用ensureCapacity来判断是否需要扩容,empty()来判断栈是否为空。java程序:import java.util.Stack;import java.util.Ar...原创 2018-05-30 17:01:22 · 124 阅读 · 0 评论 -
剑指offer-平衡二叉树
题目描述,给你一棵二叉树,判断它是不是平衡二叉树思路:平衡二叉树是左右子树高度差不超过1的二叉树,且根节点的左右子树也都是平衡二叉树,那么可以以此递归,判断每个子平衡二叉树是否成立,也就是要获得当前节点为根节点的左右子树的高度,然后判断他们高度差是否不大于1。只要不符合,则不是平衡二叉树java程序:public class Solution { //全局变量,判断是否为平衡二叉树 b...原创 2018-06-13 16:22:35 · 191 阅读 · 0 评论 -
剑指offer-栈的压入和弹出序列
题目描述,输入两个长度一样的数组pushA和popB,判断后者是前者的一个栈输出顺序吗?思路:按pushA的顺序压入栈中,若pushA[i]==popB[j],那么就弹出一个元素且j++,并且继续判断当前栈顶元素是否等于popB[j],知道栈为空或者不等。之后继续压入栈中。最后判断栈是否为空,为空的话,就返回true;java程序:import java.util.ArrayList;import...原创 2018-05-30 20:37:26 · 196 阅读 · 0 评论 -
剑指offer-从上往下打印二叉树
题目描述,从上往下,从左往右打印二叉树思路:就是层序遍历,创建一个Arraylist res作为结果返回,创建一个qunue用来存放根节点,用一个循环来遍历所有节点java程序:import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/**public class TreeNode { int...原创 2018-05-30 20:53:02 · 80 阅读 · 0 评论 -
###剑指offer-把数组排成最小的数
题目描述:给你一个正整数数组,将其元素链接成的数的最小值数出来。例:[2,32,1]最小为1232思路:有待思考。。。。别人的答案:java实现import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;public class Solution { public String Print...原创 2018-06-06 17:02:24 · 81 阅读 · 0 评论 -
***剑指offer-丑数
题目描述,输入一个N,输出第N个丑数。 丑数的意思是质因子是2,3,5的数,规定1是第一个丑数。思路:既然质因子是2,3,5, 那么一个丑数肯定就只能是2^a*3^b*5^c 的数,a,b,c为指数,丑数乘丑数也依旧是丑数。只要能正确的组合a,b,c,取不同的值,然后可以得到从小到达的丑数,那么题目就容易做出来了。可是怎么才能实现呢。考虑两个不等式, 对于指数p,2^p<3^p<5...原创 2018-06-07 21:03:58 · 133 阅读 · 0 评论 -
*剑指offer-二叉树搜索的后序遍历
题目描述,给你一个数组,判断它是不是一个搜索二叉树的后续遍历思路:递归,后序遍历,则数组最后一个元素是搜索二叉树的根节点,且根节点的值比所有左子树的值大,比所有右子树的值小,因此,可以通过这个性质从右往左跟根节点判断,去寻找第一个比根节点值小的点,则那是左子树的根节点,然后还要判断左子树所有的值都要比根节点值小,否则就返回false,这样 去掉根节点,剩下的序列可以分为两个部分,分别是左子树和右子...原创 2018-05-31 20:05:08 · 112 阅读 · 0 评论 -
*剑指offer-二叉树中和为某一值的路径
题目描述:输入一个值,和一个二叉树的根节点,输出所有可能的路径,这条路径需要满足从根节点到叶子节点的节点值的和等于输入的那个值。思路: 递归,将target减去输入的值,然后新得到的值和左子树右子树,又分别是两个子问题,以此递归。首先定义两个全局的ArrayList,一个存放当前的路径的path,一个存放符合要求的路径res。先判断root是不是null,如果是就返回res。之后将当前根节点的值放...原创 2018-05-31 20:31:52 · 105 阅读 · 0 评论 -
*剑指offer-复杂链表的复制
题目描述:给你一个链表,这个链表的节点有两个指针,一个next指向下一个节点,一个random随机指向任意一个节点,请复制这个链表,并返回头思路:做影子节点,先为每一个节点创建一个影子节点,插入到其身后,影子节点的random还没确定,第二次再循环,让影子节点的random指向原节点的random的后面那个节点,这样保证了一致性。最后将链分开。java程序:/*public class Rando...原创 2018-05-31 21:17:47 · 129 阅读 · 0 评论 -
##剑指offer-最小的K个数
题目描述:给你一个数组,找元素的值的和为最小的k个元素。思路:最简单的就是先对数组排序,然后直接前k位数就是要的结果。还可以用堆来做。java程序:import java.util.Arrays;import java.util.ArrayList;public class Solution { public ArrayList<Integer> GetLeastNumbers_...原创 2018-06-05 19:15:35 · 109 阅读 · 0 评论 -
*剑指offer-合并两个排序的链表
题目描述:给你两个递增的链表,合并它们并且合并后的是一个非递减的链表,返回头节点思路:串针线,首先先判断两个链表是否有null,都不是null的话,设置current1和current2代表两个链表的头,pre1,pre2代表current的前一个节点,初始为null,设置tmp1,tmp2为current的下一个节点,好让串线后的current向下一个节点移动。循环结束,若有个链表不为空,则接到...原创 2018-05-29 20:00:12 · 105 阅读 · 0 评论 -
剑指offer-链表中倒数第k个节点
题目描述:输入一个链表和k,返回链表倒数第k个节点值思想,做一把尺子,先顶一个引用,让它指向第k个节点a,再定义个引用指向头b,循环,让a,b同时后移,直到a为空java程序:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; ...原创 2018-05-29 18:35:40 · 63 阅读 · 0 评论 -
**剑指offer-二叉搜索树与双向链表
题目描述:给你一个二叉搜索树,在不产生新的节点的情况下,将其变为一个有序的双向链表思路:递归。1,将左子树变为双向链表,返回左子树头节点2,获得左子树最大的那个节点,将其与根节点链接3,将右子树变为双向链表,返回右子树头节点4,右子树头节点与根节点链接5,若左子树不为空就返回左子树头节点,否则返回根节点java程序:/**public class TreeNode { int val = 0...原创 2018-06-03 20:35:14 · 115 阅读 · 0 评论 -
*剑指offer-二维数组查找
题目意思:从左往右,从上往下都递增的一个二维数组,验证一个输入的数target是否在这个矩阵里。思路:从上往下递增,则每个数上面的那个数都比它小从左往右递增,则每个数左边的那个数都比它小因此,每个数都比它左边和上面的数大试想从左下角开始比较若target比数组当前位置的数大,则它可能出现在这个数的右边,那么让位置右移一位若target比数组当前位置的数小,则它可能数显在这个数的上面,那么让位置上移...原创 2018-05-28 19:22:04 · 121 阅读 · 0 评论 -
剑指offer-替换空格
题目意思:输入一个StringBuffer str字符串,将它的空格替换成“%20”返回思路一:构建一个StringBuilder res,for循环遍历str,遇到空格就append("%20"),否则后接当前字符。程序:public class Solution { public String replaceSpace(StringBuffer str) { StringB...原创 2018-05-28 19:41:04 · 123 阅读 · 0 评论 -
剑指offer-从尾到头打印链表
题目描述:输入一个链表,从尾巴到头存入一个ArrayList 后返回思路一: 递归,定义一个全局的ArrayList,同时写一个递归方法f(ListNode listNode),再递归到节点为null的时候还是往回走。程序:/*** public class ListNode {* int val;* ListNode next = null;** ...原创 2018-05-28 19:54:30 · 74 阅读 · 0 评论 -
*剑指offer-重建二叉树
题目简述:给你两个数组,pre和in,分别代表前序遍历和中序遍历的值,用他们重构二叉树思路:递归。前序遍历的第一个值肯定是根节点值,需要再中序遍历中找到这个根节点的位置,然后将其划分为两个部分,之后对这两个部分递归。难点在于递归时候的参数如何写。程序:public class Solution { public TreeNode reConstructBinaryTree(int [] pr...原创 2018-05-28 20:34:20 · 113 阅读 · 0 评论 -
剑指offer-用两个栈实现队列
题目介绍:如题,两个栈实现一个队列的功能思路:栈是先进后出,两个栈一起用可以实现先进先出java程序:import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stac...原创 2018-05-28 20:52:11 · 60 阅读 · 0 评论 -
剑指offer-旋转数组的最小数
题目描述:旋转数组就是把数组的前多少位给接到数组末尾,本题的输入数组是非递减数组的旋转数组。找出它的最小值返回。若数组为空,输出0.数组里所有值都大于0思路一: 非递减,则是大于等于,所以只要找到第一个小于前面那个数的数就是最小的了java程序:int res=0; if(array.length==0) return res; res = arr...原创 2018-05-28 21:05:24 · 98 阅读 · 0 评论 -
***剑指offer-字符串的排列
题目描述:给你个字符串,将其字符按照字典顺序排列,输出所有可能的结果思路:排列组合问题,用回溯法1,找出选择,简单的排列组合,相当于一群人握手,每个人都要与其他人握一次手,总共要n!次 n 到 n-1 到n-2 ... 2到1,这是一个递归迭代的过程,用for循环遍历当前未被选择的字符2,条件,若当前还有未被选择的字符,那么就继续for循环3,结束,若没有了,则将当前字符串添加进结果中jav...原创 2018-06-04 20:10:00 · 92 阅读 · 0 评论 -
*剑指offer-数组中出现次数超过一半的数
题目描述:给你一个数组,若这个数组存在一个数的个数超过数组的一半,则将其输出,若不存在则输出0思路:摩尔投票法摩尔投票法,只需要一次循环就可以判断这个数组是不是 不存在那个数具体操作:一个计数器count,一个存储当前可能是那个数的变量majority,从第一个数出发,赋给majority,count++,遍历数组,如果数与majority不一样,那么就count--,若相同则count++,若c...原创 2018-06-04 20:34:12 · 93 阅读 · 0 评论 -
*剑指offer-斐波那契数列
题目简述,输入一个n ,输出斐波那契数列的第n个数思路一:递归。行不通,会栈溢出思路二:动态规划。java程序:public class Solution { public int Fibonacci(int n) { int f=0,g=1; while(n-->0){ g +=f; f = g-f; ...原创 2018-05-29 15:14:06 · 115 阅读 · 0 评论 -
剑指offer-跳台阶
题目描述,输入一个target,代表有target层台阶,你可以一次跳1阶或者2阶,跳到target阶总共有多少种方法思路:递归,一开始你总共有两种跳法,所以有两种可能,跳1阶后剩下的又是一个子问题,跳2阶后剩下的也是一个子问题,这两种可能的跳法数加起来,就是总的跳法。以此递归java程序:public class Solution { public int JumpFloor(int ta...原创 2018-05-29 15:22:14 · 59 阅读 · 0 评论 -
剑指offer-变态台阶条
题目描述:输入一个target,代表有target层台阶,你一次可以跳1、2、3、4....N层,问你跳到target总共有多少种方法。思路:递归,如果推导出递归关系,n层总共有f(n)=f(n-1)+f(n-2)+....f(1) 种方法,f(n-1)=f(n-2)+f(n-3)+....f(1)。两式子相减得到:f(n)= 2*f(n-1)从而很容易写出程序了java程序:public cla...原创 2018-05-29 15:30:17 · 76 阅读 · 0 评论 -
剑指offer-矩形覆盖
题目描述:输入一个n,代表有n块 2*1的小矩形,用它们去填一个2*n的大矩阵,总共有多少种填的方法思路:递归,其实本题就是一个斐波那契数列,小矩形有可以横着摆2*1或者竖着摆1*2,这两种摆法是两种不同的填的方法,而竖着摆的时候必须消耗2块小矩形,组成一个2*2的矩形,所以问题就可以这么想。如果第一次是横着摆,那么剩下的就有f(n-1)种摆法,如果第一次是竖着摆,则需要2个小矩形,那么剩下的就由...原创 2018-05-29 15:46:12 · 55 阅读 · 0 评论 -
*剑指offer-二进制中1的个数
题目描述:给你一个数,输出它二进制表示形式有多少个1思路:用了一个很巧妙的方法,一个数n , 它与上n-1 ,则会把自己二进制表示形式的最右边那个1给变成0,利用这个性质,一下子就能做出来了java程序:public class Solution { public int NumberOf1(int n) { int count =0; while(n!=0){ ...原创 2018-05-29 15:50:32 · 113 阅读 · 0 评论 -
*剑指offer-数值的整数次方
题目描述: 输入一个double类型的数base和一个int类型的数exponent,求base的exponent次方思路:1,正负判断,base为0,exponent为负,则出错;base不为0,exponent有正负两种情况。2,指数二进制表达,按位来做指数计算,例如13的二进制1101,10的13次方就可以表示为10^0001*10^0100*10^1000。3,如果当前最右边位为1,那么就...原创 2018-05-29 16:45:43 · 113 阅读 · 0 评论 -
剑指offer-调整数组顺序
题目描述:调整数组顺序,使得奇数在前半部分,偶数再后半部分,它们的相对位置不能变。思想: 开辟一个新的数组,然后把奇数先放进来,偶数后放进来,之后再复制给原数组java程序:public class Solution { public void reOrderArray(int [] array) { int[] s = new int[array.length]; ...原创 2018-05-29 17:21:05 · 272 阅读 · 0 评论 -
剑指offer-第一个只出现一次的字符
题目描述:给你一个字符串,找到这个字符串中第一个只出现过一次的字符思路,建立一个linkedhashmap,存储每个字母出现的次数,然后再遍历这个map,找出第一个值是1的编号java程序:import java.util.LinkedHashMap;public class Solution { public int FirstNotRepeatingChar(String str) { ...原创 2018-06-08 19:10:25 · 76 阅读 · 0 评论