![](https://img-blog.csdnimg.cn/20190430200526613.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
《剑指Offer》系列
文章平均质量分 90
微信关注:Java编程之道
LeoByte.
唯有编程与自由不可辜负
展开
-
面试必备--八大排序算法
文章目录冒泡排序(BubbleSort)算法思路算法图解冒泡代码:直接插入排序(InsertSort)算法思路算法图解直插代码:归并排序(MergeSort)算法思路算法图解归并代码:快速排序(QuickSort)算法思路算法图解快排代码:希尔排序(ShellSort)算法思路算法图解希尔代码:堆排序(HeapSort)算法思路算法图解堆代码:基数排序(RadixSort)算法思路算法图解基数代码......原创 2019-05-30 19:58:22 · 2413 阅读 · 0 评论 -
每日手撕--LRU算法
LRU算法介绍LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。简单描述一下在《操作系统》这本书里面对于LRU算法的解说。假定系统为某进程分配了3个物理块,进程运行时的页面走向为 7 0 1 2 0 3 0 4,开始时3个物理块均为空,那么LRU 算法是如下工作的:这就是最基本的LRU的磁盘调度逻辑,该算法运用领域比较广泛比如Redis的内存淘汰策略等等,原创 2020-07-04 20:06:48 · 2419 阅读 · 0 评论 -
[剑指Offer]-最长不含重复字符的子字符串
题目描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。例如,在字符串中”arabcacfr”,最长非重复子字符串为”acfr”,长度为4。解题思路老老实实O(n^2)实现,细节你懂的,书上那种高效率的我没太看懂。要啥自行车…算法图解比较简单不做图了!就是拿出每一位组成串,判断新入字符的是否存在,如果存在一切归零...原创 2019-05-26 20:26:20 · 2482 阅读 · 0 评论 -
[剑指Offer]-礼物的最大值
题目描述在一个 m*n 的棋盘中的每一个格都放一个礼物,每个礼物都有一定的价值(价值大于0).你可以从棋盘的左上角开始拿各种里的礼物,并每次向左或者向下移动一格,直到到达棋盘的右下角。给定一个棋盘及上面个的礼物,请计算你最多能拿走多少价值的礼物?在这个棋盘中,按照(1,12,5,7,7,16,5)的顺序可以拿到总价值最大的礼物。解题思路一个很直观的想法是,我们将每一步求解出的结果都保...原创 2019-05-26 20:22:55 · 2033 阅读 · 0 评论 -
[剑指Offer]-把数字翻译成字符串
题目描述给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。解题思路若ab > ba 则 a > b若ab < ba 则 a < b若ab = ba 则 a = b...原创 2019-05-26 20:18:30 · 2058 阅读 · 0 评论 -
[剑指Offer]-把数组排成最小的数字
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如,输入数组{3, 32,321},则打印出这3个数字能排成的最小数字321323。核心在于自定义一个排序规则解题思路若ab > ba 则 a > b若ab < ba 则 a < b若ab = ba 则 a = b解释说明:a = 21b = 2...原创 2019-05-26 20:16:45 · 2130 阅读 · 0 评论 -
[剑指Offer]- 数字序列中某一位的数字
题目描述数字以01234567891011121314…的格式排列。在这个序列中,第5位(从0开始计)是5,第13位是1,第19位是4。求任意第n为对应的数字。这是个数学规律题解题思路每次枚举一个数字的时候,求出数字是几位数,并把该数字的位数和前面所有的数字的位数累加-当和大于该数,则第n位数一定在这里面算法图解参考代码:package offer;/** * 数字...原创 2019-05-26 20:13:35 · 2216 阅读 · 0 评论 -
[剑指Offer]- 剪绳子
题目描述给定一根长度为n的绳子,请把绳子剪成m段,每段绳子记为k[0],k[1]……k[m]。请问k[0]*k[1]……*k[m]可能的最大乘积是多少?例如:当绳子长度为8时,我们把它剪成长度分别为2,3,3段,此时最大乘积为18.解题思路先用常规的需要O(n^2)时间和O(n)空间的动态规划的思路,接着用只需要O(1)时间和空间的贪婪算法来分析解决这个问题。动态规划首先定义函数...原创 2019-05-25 16:05:53 · 1969 阅读 · 0 评论 -
[剑指Offer]- 机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?解题思路本题使用的方法同样还是回溯法,另...原创 2019-05-24 20:28:21 · 1893 阅读 · 0 评论 -
[剑指Offer]- 数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。由于数据是从一个数据流中读出来,因而数据的数目随着时间的增加而增加,如果用一个数据容器来保存从流中读出来的数据,则当新的数据从流中读出来的时候,这些数据就插入数据容器。解题思路比较Low的写法...原创 2019-05-24 18:41:13 · 1990 阅读 · 0 评论 -
[剑指Offer]-字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。解题思路把字符串分成两部分,一部分是第一个字符,另一个部分是后面其余的字符串拿第一个字符和后面的字符串依次交换,这是一个递归的过程注意:在递归里第一次交换是自身和自身的交换,保证不缺...原创 2019-05-24 18:36:01 · 1906 阅读 · 0 评论 -
[剑指Offer]-序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树解题思路序列化是指通过前序遍历把二叉树变成数组反序列化是指重建二叉树算法图解参考代码:package offer;/** * 请实现两个函数,分别用来序列化和反序列化二叉树 */import javax.swing.tree.TreeNode;public class Offer37 { String ...原创 2019-05-24 18:34:09 · 1960 阅读 · 0 评论 -
[剑指Offer]-二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如输入下图中左边的二叉搜索树,则输出转换之后的排序双向链表。解题思路中序遍历树中的每一个结点,这是因为中序遍历算法的特点是按照从小到大的顺序遍历二叉树的每一个结点。按照中序遍历的顺序,当我们遍历转换到根结点(值为10的结点)时,它的左子树已经转换成一个排序的链表了...原创 2019-05-24 18:30:59 · 1925 阅读 · 0 评论 -
[剑指Offer]-数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数:如数组{7,5,6,4},逆序对总共有5对,{7,5},{7,6},{7,4},{5,4},{6,4};解题思路暴力解法,顺序扫描整个数组,每扫描到一个数字的时候,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,则这两个数字就组成一个逆序对。假...原创 2019-05-22 19:38:05 · 1992 阅读 · 1 评论 -
[剑指Offer]-第一个只出现一次的字符
题目描述在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出’b’。解题思路为了解决这个问题,我们可以定义一个哈希表(外部空间),其键值(Key)是字符,而值(Value)是该字符出现的次数。同时我们还需要从头开始扫描字符串两次:(1)第一次扫描字符串时,每扫描到一个字符就在哈希表的对应项中把次数加1。(时间效率O(n))(2)第二次扫描时,每扫描到一个字符...原创 2019-05-22 19:36:09 · 1935 阅读 · 0 评论 -
[剑指Offer]-丑数
题目描述我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。解题思路.如果一个数能够被2整除,那么让他继续除以2;如果一个数能够被3整除,那么让他继续除以3;如果一个数能够被5整除,那么让他继续除以5;如果最后这个数变为1,那么这个数就是丑数,否则不是。...原创 2019-05-22 19:33:59 · 2005 阅读 · 0 评论 -
[剑指Offer]- 1-n整数中1出现的次数
题目描述给定一个整数n,求1~n这n个整数中十进制表示中1出现的次数。解题思路最直观的是,对于1~n中的每个整数,分别判断n中的1的个数。这种方法的时间复杂度为O(N*logN)算法图解参考代码:package offer;/** * 1-n整数中1出现的次数 * 最直观的是,对于1~n中的每个整数,分别判断n中的1的个数,具体见《剑指offer》。这种方法的时间复杂度为...原创 2019-05-22 19:32:09 · 2261 阅读 · 0 评论 -
[剑指Offer]-数组中出现次数超过一半的数字
题目描述数组中一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为 9 的数组{1,2,3,2,2,2,5,4,2}。由于数字 2 在数组中出现了 5 次,超过数组长度的一半,因此输出 2.解题思路当我们遍历到下一个数字的时候,如果下一个数字和当前我们保存的数字相同,则次数加 1;如果和当前我们保存的数字不同,则次数减 1;当次数减到 0 的时候,我们将保存的数字...原创 2019-05-22 19:27:31 · 1977 阅读 · 0 评论 -
[剑指Offer]-队列的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个:{[2,3,4],2,6,2,5,1},{2,[3,4,2],6,2,5,1},{2,3,[4,2,6],2...原创 2019-05-20 11:12:27 · 2049 阅读 · 0 评论 -
[剑指Offer]-两个链表的第一个公共节点
题目描述输入两个链表,找出它们的第一个公共结点。解题思路暴力搜索,遍历一个链表的每个节点时开启另一个链表节点的遍历。时间复杂度:O(nm)借助栈,从后往前出栈。时间复杂度:O(n+m),空间复杂度O(n+m)先走n步达到同步。时间复杂度:O(n+m),空间复杂度O(1)算法图解参考代码:package offer;import java.util.Stack;/**...原创 2019-05-18 21:42:12 · 1927 阅读 · 0 评论 -
[剑指Offer]-数组中唯一只出现一次的数字
题目描述在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。这题有点意思,其他数字都重复了三次,一般位运算就消不掉了。解题思路将所有数字的二进制表示的对应位都加起来,如果某一位能被三整除,那么只出现一次的数字在该位为0;反之,为1。算法图解参考代码:package offer;/** * 数组中唯一个出现一次的数字, * 除此之...原创 2019-05-18 18:53:46 · 2041 阅读 · 0 评论 -
[剑指Offer]-数组中数字出现次数
题目描述一个整数数组里除了两个数字出现一次,其他数字都出现两次。请找出这两个数字。要求时间复杂度为o(n),空间复杂度为o(1)。这种设计到位运算的我就觉得比递归友好多了,数据处理角度不一样,感觉很有意思。解题思路设法划分为两个数组,将只出现一次的数字分别存入两个数组分别对两个数组异或运算算法图解参考代码:package offer;/** * 数组中数字出现的次数...原创 2019-05-18 18:49:54 · 2013 阅读 · 0 评论 -
[剑指Offer]-二叉树的深度
题目描述(一)输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如下图中的二叉树的深度为4,因为它从根结点到叶结点最长的路径包含4个结点(从根结点1开始,经过结点2和结点5,最终到达叶结点7)解题思路如果一棵树只有一个结点,它的深度为1。如果根结点只有左子树而没有右子树,那么树的深度应该是其左子树的深...原创 2019-05-18 18:42:24 · 38052 阅读 · 7 评论 -
[剑指Offer]-二叉搜索树的第K大节点
题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。解题思路中序遍历二叉树递归将遍历的节点按顺序存入集合获取第K-1个集合元素递归真的反人性全靠想象。算法图解参考代码:package offer;import java.util.ArrayList;/** * 二叉搜索树的第K大节点 */public class Offer54 { publi...原创 2019-05-18 18:33:08 · 2342 阅读 · 0 评论 -
[剑指Offer]-在排序数组中查找数字
题目描述(一)统计一个数字在排序数组中出现的次数。{1,2,3,3,3,3,4,5} 3出现了4次。解题思路当然可以无脑用哈希表或者直接遍历,空间复杂度O(n),时间复杂度O(1)代码略优化:在找第一个k时,首先也是二分找到中间的k,然后和它上一个数字相比,如果还是k,则在前半段数组继续二分,直到找到中间的数为k且前一个不等于k。用同样的方法,找最后一个k时间复杂度为O(logn)...原创 2019-05-18 18:21:06 · 1999 阅读 · 0 评论 -
[剑指Offer]-和为S的连续正数序列
题目描述输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1-5,,4-6和7-8.解题思路以求和为9的所有连续序列为例,假设两个指针pSmall和pBig一开始pSmall=1,pBig=2,,pSum=3<9,序列需要包含更多的数,于是pBig+1,此时pSum=6,依旧...原创 2019-05-17 19:54:19 · 2141 阅读 · 0 评论 -
[剑指Offer]-复杂链表的复制
题目描述请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个Next指针指向下一个结点外,还有一个Sibling指向链表中的任意结点或者NULL。解题思路创建新的节点同时将原来链表的信息复制过来,将新结点连接起来将当前新旧节点存入到同一个map容器里面K-old,B-copy遍历map容器,...原创 2019-05-16 20:11:48 · 1887 阅读 · 0 评论 -
[剑指Offer]-构建乘积数组
题目描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。本题属于思维题解题思路下三角用连乘可以很容易求得,先算下三角中的连乘,即先计算出B[i]中的一部分,然后将上三角中的数也乘进去。这样一来就只需要两个循环就可以解决这个问题。时间复杂度是O(n);...原创 2019-05-16 20:00:13 · 1829 阅读 · 0 评论 -
[剑指Offer]-不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。本题属于思维题解题思路java中自带BigInteger类,可以把int数值转为String类型; 然后使用BigInteger的 public BigInteger(String val)构造方法new出BigInteger对象;调用BigInteger的add方法,然后把结果转为int类型。。...原创 2019-05-16 19:55:07 · 2090 阅读 · 0 评论 -
[剑指Offer]-求1+2+3+..n
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。本题属于思维题解题思路书上写了大一堆,我能简单理解的还是一下这种设置static变量,利用他的特性,在多次创建对象时候实现一个累加。算法图解参考代码:package offer;/** * 求1+2+。。。n */pu...原创 2019-05-16 19:45:10 · 1952 阅读 · 0 评论 -
[剑指Offer]-股票的最大利润
题目描述假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能获得最大的利润为11.解题思路暴力比较:时间复杂度O(n^2)最大利润无外乎就是计算后面的数字减去前面的数字得到的一个最大的差值,当我们确定卖出价后,...原创 2019-05-16 19:41:23 · 1954 阅读 · 0 评论 -
[剑指Offer]-圆圈中最后剩下的数字约瑟夫环问题
题目描述0, 1, … , n-1 这 n 个数字排成一个圈圈,从数字 0 开始每次从圆圏里删除第 m 个数字。求出这个圈圈里剩下的最后一个数字。解题思路创建一个总共有 n 个结点的环形链表,然后每次在这个链表中删除第 m 个结点。算法图解参考代码:package offer;import java.util.LinkedList;import java.util.List...原创 2019-05-16 19:31:18 · 1960 阅读 · 0 评论 -
[剑指Offer]-扑克牌中的顺子
题目描述从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。其中A为1,J为11,Q为12,K为13,而大小王为0,且大小王能够当做任意一张牌。解题思路首先应该对数组进行排序。统计数组中大小王(0)出现的个数。统计数组中所有相邻数之间的间隔。同时还需要排除对子的情况,如果出现了对子,那么肯定不可能是顺子(0除外)。最后比较0的个数和间隔大小,如果0的个数大于等于间隔...原创 2019-05-16 19:25:50 · 2121 阅读 · 0 评论 -
[剑指Offer]-左旋转字符串
题目描述字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。解题思路以"abcdefg"为例,我们可以把它分为两部分。由于想把它的前两个字符移到后面,我们就把前两个字符分到第一部分,把后面的所有字符都分到第二部分。我们先分别翻转这两部分,于...原创 2019-05-16 19:04:29 · 1928 阅读 · 0 评论 -
[剑指Offer]-翻转字符串
题目描述输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。解题思路整体翻转局部翻转算法图解注意代码中对于结束递归的条件的设定!是否访问数组的赋值!参考代码:package offer;/** * 输入一个英文句子,翻转句...原创 2019-05-16 18:59:03 · 2047 阅读 · 0 评论 -
[剑指Offer]-二叉树中和为某一的的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。例如下图,输入的二叉树和整数22,则打印出两条路径,第一条路径包含节点10、12;第二条路径包含节点10、5和7 。这里存在回退去遍历另一节点,所以考虑使用栈来存储元素。解题思路当遍历到一个节点的时候将当前节点入栈,同时current...原创 2019-05-14 18:43:59 · 1888 阅读 · 0 评论 -
[剑指Offer]-二叉搜索树的后序遍历
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true。否则返回false。假设输入的数组的任意两个数字都互不相同。回顾后序遍历的特点我们可以直到数组的最后一位一定时根节点。而二叉搜索树是一种空树或者二叉树的所有结点比它的左子结点大,比它的右子结点小。后序遍历:5, 7, 6, 9, 11, 10, 8解题思路在后序遍历得到的序列中,最后一...原创 2019-05-14 18:34:35 · 1855 阅读 · 0 评论 -
[剑指Offer]-分行从上到下打印二叉树
题目描述从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印 ,每一层打印一行。解题思路一个变量保存当前层还没有打印的节点数,一个变量表示下一层节点数目利用队列先入先出的特性,暂存每层需要被打印的节点。算法图解参考代码:package offer;import java.util.Queue;import java.util.concurrent.LinkedB...原创 2019-05-14 18:23:48 · 2181 阅读 · 0 评论 -
[剑指Offer]-不分行从上到下打印二叉树
题目描述从上往下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如输入下图的二叉树,则一次打印出8,6,10,5,7,9,11。题目要求一次打印,所以需要你将先序遍历出来的节点做个一保存。解题思路当某节点存在子节点则将其保存到一个队列里面,接着取出队列中头节点,直到队列为空!算法图解走递归先序遍历二叉树,当走到子节点为空时,会弹出并打印当前节点,此时的队列还不为空...原创 2019-05-13 21:18:32 · 1980 阅读 · 0 评论 -
[剑指Offer]-矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如在下面的3x4的矩阵中包含一条字符串"bcced"的路径(路径中的字母用斜体表示)。但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中...原创 2019-05-13 21:04:00 · 1898 阅读 · 0 评论