![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
文章平均质量分 59
小马哥MAX
刷题记录BLOG
展开
-
【一次过】二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路:矩阵是有序的,从左下角来看,向上数字递减,向右数字递增,因此从左下角开始查找,当要查找数字比左下角数字大时。右移,要查找数字比左下角数字小时,上移public class ...原创 2019-03-20 09:26:42 · 109 阅读 · 0 评论 -
【两次过】【双指针】和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数...原创 2019-05-06 09:55:14 · 121 阅读 · 0 评论 -
【一次过】【双指针】和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。解题思路:双指针。一前一后,向中间靠拢数列满足递增,设两个头尾两个指针i和j,若ai + aj == sum,就是答案(相差越远乘积越小)若ai + aj > sum,aj...原创 2019-05-06 10:18:30 · 106 阅读 · 0 评论 -
【两次过】二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)解题思路:dfsimport java.util.ArrayList;/**public class TreeNode { int val = 0; T...原创 2019-05-01 10:12:47 · 81 阅读 · 0 评论 -
【一次过】左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!解题思路:三次旋转。先旋转需要左移的字符串,然后旋转其他字符串,最后将两旋转后的字符串拼接...原创 2019-05-07 08:58:24 · 144 阅读 · 0 评论 -
【简单】Lintcode 53. 翻转字符串中的单词
给定一个字符串,逐个翻转字符串中的每个单词。说明单词的构成:无空格字母构成一个单词 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个解题思路1:1、先翻转整个字符串,再把每个单词反转,得到结果。class Solution {public: /* * @para...原创 2018-01-29 22:28:09 · 393 阅读 · 0 评论 -
【一次过】扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K...原创 2019-05-07 09:53:02 · 225 阅读 · 0 评论 -
【两次过】构建乘积数组
题目描述给定一个数组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]的值可以看作下图的矩阵中每行的乘积。下三角用连乘可以很容求得,上三角,从下向上也是连乘。因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B[i...原创 2019-05-09 19:59:59 · 99 阅读 · 0 评论 -
【一次过】Lintcode 103. 带环链表 II
给定一个链表,如果链表中存在环,则返回到链表中环的起始节点,如果没有环,返回null。样例给出-21->10->4->5,返回10解释:最后一个节点5指向下标为1的节点,也就是10,所以环的入口为10挑战不使用额外的空间解题思路:在网上搜集了一下这个问题相关的一些问题,思路开阔了不少,总结如下:1. 环的长度是多少?2. 如何找到环中第一个节点...原创 2018-11-08 11:02:16 · 130 阅读 · 0 评论 -
【一次过】Lintcode 113. 删除排序链表中的重复数字 II
给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。样例给出1->2->3->3->4->4->5->null,返回1->2->5->null给出1->1->1->2->3->null,返回2->3->null解题思路: 照例新建一个dummy节点作...原创 2018-07-11 09:08:35 · 154 阅读 · 0 评论 -
【两次过】圆圈中最后剩下的数
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去.....原创 2019-05-08 09:12:57 · 88 阅读 · 0 评论 -
【两次过】二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解题思路:分析二叉树的下一个节点,一共有以下情况:1.二叉树为空,则返回空;2.若节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;3.若节点右孩子不存在:查看该节点是否是其父节...原创 2019-05-11 09:39:56 · 113 阅读 · 0 评论 -
【一次过】Lintcode 468. 对称二叉树
给你一颗二叉树,判断是否是对称二叉树样例例1:输入:{1,2,2,3,4,4,3}输出:true说明: 1 / \ 2 2 / \ / \ 3 4 4 3是一个对称的二叉树。例2:输入:{1,2,2,#,3,#,3}输出:false说明:1 / \...原创 2019-02-10 10:17:11 · 190 阅读 · 0 评论 -
【一次过】Lintcode 71. 二叉树的锯齿形层次遍历
给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行)样例给出一棵二叉树{3,9,20,#,#,15,7}, 3 / \ 9 20 / \ 15 7返回其锯齿形的层次遍历为:[ [3], [20,9], [15,7]]解题思路:与Lintcode 69:Binary T...原创 2018-07-17 10:01:34 · 131 阅读 · 0 评论 -
【两次过】Lintcode 7. 二叉树的序列化和反序列化
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。样例给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构: 3 / \9 20 / ...原创 2018-08-28 11:29:16 · 170 阅读 · 0 评论 -
【两次过】Lintcode 902. BST中第K小的元素
给一棵二叉搜索树,写一个KthSmallest函数来找到其中第 K 小的元素。样例样例 1:输入:{1,#,2},2输出:2解释: 1 \ 2第二小的元素是2。样例 2:输入:{2,1,3},1输出:1解释: 2 / \1 3第一小的元素是1。挑战如果这棵 BST 经常会被修改(插入/删除操作)并且你需要很快速的找到第 K...原创 2018-10-10 10:14:10 · 177 阅读 · 0 评论 -
【两次过】数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。解题思路:如果直接采用数组存储,然后排序获得中位数,时间复杂度为O(n)。最理想的状况是采用红黑树...原创 2019-05-13 09:51:56 · 103 阅读 · 0 评论 -
【两次过】机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?解题思路:从(0,0)点开始dfs,...原创 2019-05-13 10:50:53 · 84 阅读 · 0 评论 -
【两次过】数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路:可以用位运算实现,如果将所有所有数字相异或,则最后的结果肯定是那两个只出现一次的数字异或的结果,所以根据异或的结果1所在的最低位,把数字分成两半,每一半里都还有只出现一次的数据和成对出现的数据,这样继续对每一半相异或则可以分别求出两个只出现一次的数字//num1,num2...原创 2019-05-06 09:25:39 · 136 阅读 · 0 评论 -
【两次过】二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路:BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归...原创 2019-04-25 10:44:42 · 86 阅读 · 0 评论 -
【一次过】把字符串转换成整数
题目描述将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0示例1输入+2147483647...原创 2019-05-08 09:37:58 · 226 阅读 · 0 评论 -
【两次过】变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路:与Lintcode 111. 爬楼梯类似,只不过递推式变为dp[i] = dp[i-1] + dp[i-2] + ... + dp[0] + 1;注意不要漏了+1,因为任何台阶都有一次性跳上的跳法。public class Solution { ...原创 2019-03-16 09:27:15 · 132 阅读 · 0 评论 -
【一次过】Lintcode 159. 寻找旋转排序数组中的最小值
假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7可能变成是4 5 6 7 0 1 2)。你需要找到其中最小的元素。你可以假设数组中不存在重复的元素。样例给出[4,5,6,7,0,1,2] 返回 0注意事项You may assume no duplicate exists in the array.解题思路1:直接使用treeSet,返回...原创 2018-09-03 15:34:35 · 124 阅读 · 0 评论 -
【两次过】不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解题思路:首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2。第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。同样我们可以用三步走的方...原创 2019-03-13 11:16:51 · 88 阅读 · 0 评论 -
【两次过】调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路1:比较直观的思路:新建一个与array同样大小的数组tmp,遍历array,先将奇数放进tmp,再将偶数放进tmp。时间复杂度O(N),空间复杂度O(N)public void reOrderAr...原创 2019-04-04 10:40:59 · 71 阅读 · 0 评论 -
【两次过】数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路1:先排序然后取中间那位数,时间复杂度为O(nlogn),显然不是很好。第二个容易想到的是利用HashMap存储数与它出现的次数,时间复杂度为O(n),但空间...原创 2019-04-16 10:14:21 · 118 阅读 · 0 评论 -
【两次过】栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路1:观察到这样一个规律,先在入栈序列中找到出栈序列的第一个元素,找不到...原创 2019-04-21 09:41:28 · 170 阅读 · 0 评论 -
【一次过】Lintcode 12 :带最小值操作的栈
实现一个栈, 支持以下操作:push(val)将 val 压入栈 pop()将栈顶元素弹出, 并返回这个弹出的元素 min()返回栈中元素的最小值要求 O(1) 开销.样例样例 2:输入: push(1) min() push(2) min() push(3) min()输出: 1 1 1注意事项保证栈中没有数...原创 2018-05-28 13:49:19 · 270 阅读 · 0 评论 -
【一次过】合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路:归并中的merge操作。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/...原创 2019-04-14 11:08:26 · 109 阅读 · 0 评论 -
数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不能使用库函数!解题思路1:正常的循环乘。需要注意解决0和负数的问题。时间复杂度O(n)public class Solution { public double Power(double base, int exponent) { if(...原创 2019-04-17 10:04:08 · 123 阅读 · 0 评论 -
【两次过】矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路:设dp[i]为用i个2*1的小矩形无重叠地覆盖一个2*i的大矩形,总共有dp[i]种方法.考虑两种情况:当小矩形竖着时,则有dp[i-1]种方法当小矩形横着放时,则下面一格也只能横着放一个,一共占据2格,则有dp[i-2]种方法综...原创 2019-04-15 10:05:00 · 129 阅读 · 0 评论 -
【两次过】Lintcode 374. 螺旋矩阵
给定一个包含mxn个要素的矩阵,(m行,n列),按照螺旋顺序,返回该矩阵中的所有要素。样例样例 1:输入:[[ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]样例 2输入:[[ 6,4,1 ], [ 7,8,9 ]]输出: [6,4,1,9,8,7]解题思路:把矩阵看成若干个...原创 2019-04-15 11:01:19 · 174 阅读 · 0 评论 -
【一次过】二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路:与Lintcode 378. 将二叉查找树转换成双链表类似,不同的是这个不需要新建节点。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNo...原创 2019-05-03 09:37:03 · 166 阅读 · 0 评论 -
【一次过】整数中1出现的次数
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。解题思路1:常规解法,依次遍历查看分解每个数字。public...原创 2019-05-03 10:44:38 · 160 阅读 · 0 评论 -
【两次过】【Comparator】把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路:先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。排序规则如下:若ab > ba 则 a > b,若a...原创 2019-05-04 09:11:31 · 103 阅读 · 0 评论 -
【两次过】Lintcode 4. 丑数 II
设计一个算法,找出只含素因子2,3,5的第n小的数。符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...样例如果n = 9, 返回10挑战要求时间复杂度为O(nlogn)或者O(n)注意事项我们可以认为1也是一个丑数解题思路:暴力解法不做介绍大家都可以想到,在该题会time limited。换一种思路是:所有的肯定都是由2,...原创 2018-08-25 11:24:25 · 146 阅读 · 0 评论 -
【两次过】【归并排序】数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%1...原创 2019-05-05 09:20:00 · 143 阅读 · 0 评论 -
【两次过】【二分搜索】数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。解题思路:先通过二分查找找到该数字第一次出现的位置,再通过二分查找找到该数字最后一次出现的位置,最后返回两结果的差值即可。注意二分搜索左值和右值在边界处理上不同,特别是搜索右边界时,必须是while(l+1 < r),否则就会陷入死循环,原因是mid的值由于取(l+r)/2整数,永远偏向左方,所以搜索到最后总会l与mid重合,r在另...原创 2019-05-05 10:13:38 · 188 阅读 · 0 评论 -
【一次过】Lintcode 40. 用栈实现队列
正如标题所述,你需要使用两个栈来实现队列的一些操作。队列应支持push(element),pop() 和 top(),其中pop是弹出队列中的第一个(最前面的)元素。pop和top方法都应该返回第一个元素的值。样例比如push(1), pop(), push(2), push(3), top(), pop(),你应该返回1,2和2挑战仅使用两个栈来实现它,不使用任何其他数据...原创 2018-08-13 19:25:21 · 113 阅读 · 0 评论