![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
文章平均质量分 75
剑指Offer刷题
overlordmax
这个作者很懒,什么都没留下…
展开
-
225. 用队列实现栈
225. 用队列实现栈1.题目描述使用队列实现栈的下列操作:push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空注意:1.你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。2.你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。3.你原创 2020-06-07 22:55:31 · 99 阅读 · 0 评论 -
队列的最大值
队列的最大值1.题目描述请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1示例 1:示例 2:2.思路(双向队列)维护一个双向队列,使其元素递减用于获取队列的最大值,一个辅助队列,用于出队列,入...原创 2020-03-23 15:48:18 · 202 阅读 · 0 评论 -
239. 滑动窗口最大值
239. 滑动窗口最大值1.题目描述给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例:2.思路(双向队列)声明了一个变量 dequemaxWin,用于存储下标。这个变量有以下特点:1.变量的最前端(也就是 window.front())是此次遍历的最...原创 2020-02-10 20:07:05 · 151 阅读 · 0 评论 -
和为s的连续正数序列
和为s的连续正数序列1.题目描述输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:示例 2:限制:1 <= target <= 10^52.思路(双指针) 我们用两个指针 l和 r表示当前枚举到的以 l 为起点到 r 的区间,sum 表示 [l,r]...原创 2020-03-23 12:25:32 · 127 阅读 · 0 评论 -
数字序列中某一位的数字
数字序列中某一位的数字1.题目描述数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。示例 1:示例 2:限制:0 <= n < 2^312.思路1.确定第n位是几位数:每个位数对应有9*pow(10,digits-...原创 2020-03-16 22:23:18 · 123 阅读 · 0 评论 -
顺时针打印矩阵
顺时针打印矩阵1.题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:示例 2:限制:0 <= matrix.length <= 1000 <= matrix[i].length <= 1002.思路考虑设定矩阵的“左、上、右、下”四个边界,矩阵遍历顺序为:将元素按顺序添加至数组 res 尾部。边界判定:3.代码...原创 2020-03-14 14:28:55 · 191 阅读 · 0 评论 -
剪绳子 II
剪绳子 II1.题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m] 。请问 k[0]∗k[1]∗...∗k[m]k[0]*k[1]*...*k[m]k[0]∗k[1]∗...∗k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到...原创 2020-03-13 19:48:06 · 150 阅读 · 0 评论 -
一个通用方法解决六种股票问题
一个通用方法解决股票问题1.穷举框架 利用「状态」进行穷举。我们具体到每一天,看看总共有几种可能的「状态」,再找出每个「状态」对应的「选择」。我们要穷举所有「状态」,穷举的目的是根据对应的「选择」更新状态。听起来抽象,你只要记住「状态」和「选择」两个词就行,下面实操一下就很容易明白了。for 状态1 in 状态1的所有取值: for 状态2 in 状态2的所有取值: ...原创 2020-02-12 13:12:18 · 321 阅读 · 0 评论 -
买卖股票的最佳时机 III
买卖股票的最佳时机 III1.题目描述给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:示例 2:示例 3:2.思路状态方程dp[i][2][1] = max(dp[i-1][2][1],dp[i-1][2][...原创 2020-02-12 12:13:38 · 108 阅读 · 0 评论 -
买卖股票的最佳时机 II
买卖股票的最佳时机 II1.题目描述给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:示例 2:示例 3:2.思路只要当天的价格比前一天高,就可以卖出去,然后把所有收益累加。3.代码class...原创 2020-02-12 11:16:06 · 66 阅读 · 0 评论 -
除自身以外数组的乘积
除自身以外数组的乘积1.题目描述给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:2.思路对于给定索引 i,我们将使用它左边所有数字的乘积乘以右边所有数字的乘积。算法:1.初始化两个空数组 L 和 R。对于给定索引 i,L[i] 代表的是 i 左侧所...原创 2020-02-11 20:56:41 · 174 阅读 · 0 评论 -
不用加减乘除实现加法
不用加减乘除实现加法1.题目描述不用加减乘除实现加法2.思路位运算中的两数加法,其实来来回回就只有下面这四种:0 + 0 = 00 + 1 = 11 + 0 = 11 + 1 = 0(进位 1)仔细一看,这就是相同位为 0,不同位为 1 的异或运算。算法过程:1.a + b 的问题拆分为 (a 和 b 的无进位结果) + (a 和 b 的进位结果)2.无进位加法使用异或运算...原创 2020-02-11 19:44:59 · 137 阅读 · 0 评论 -
求1+2+3+...+n
求1+2+3+…+n1.题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。2.思路利用递归及&&运算的短路原理3.代码class Solution {public: int Sum_Solution(int n) { int sum = n; ...原创 2020-02-11 16:17:37 · 76 阅读 · 0 评论 -
买卖股票的最佳时机
买卖股票的最佳时机1.题目描述给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。示例 1:示例 2:2.思路维持两个变量——min 和 maxDiff,它们分别对应迄今为止所得到的最小的值和最大的利润(卖出价格与最低价格之间的最大差值)。3....原创 2020-02-11 13:38:20 · 70 阅读 · 0 评论 -
圆圈中最后剩下的数
圆圈中最后剩下的数1.题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…...原创 2020-02-11 13:09:25 · 93 阅读 · 0 评论 -
扑克牌顺子
扑克牌顺子1.题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为...原创 2020-02-11 11:43:22 · 130 阅读 · 0 评论 -
n个骰子的点数
n个骰子的点数1.题目描述把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率。2.思路(动态规划)1.现在变量有:骰子个数,点数和。当有n个骰子,点数和为s时,出现次数记为f(n,s)。那与n-1个骰子阶段之间的关系是怎样的?2.当有n-1个骰子时,再增加一个骰子,这个骰子的点数只可能为1、2、3、4、5或6。那n个骰子得到点数和为s的情况有:...原创 2020-02-11 11:20:55 · 144 阅读 · 0 评论 -
左旋转字符串
左旋转字符串1.题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!2.思路循环左移n位可以先反转整个序列,然后翻转0~倒数n位的字符,最后翻转后...原创 2020-02-10 13:39:16 · 97 阅读 · 0 评论 -
翻转字符串
翻转字符串1.题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?2.思路...原创 2020-02-10 13:21:27 · 196 阅读 · 0 评论 -
和为S的两个数字
和为S的两个数字1.题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。2.思路设置两个下标left,right分别指向数组头和尾,计算curSum = array[left] + array[right],如果curSum > sum,则right–,否则left++,直到curSum == sum...原创 2020-02-06 19:55:43 · 86 阅读 · 0 评论 -
数组中的逆序对
数组中的逆序对1.题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100...原创 2020-02-06 15:50:48 · 425 阅读 · 0 评论 -
只出现一次的数字 III
只出现一次的数字 III1.题目描述给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。示例 :注意:1.结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。2.你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?2.思路使用异或运算可以帮助我们消除出现两次的数字;我们计算 bitmask...原创 2020-02-04 16:16:11 · 126 阅读 · 0 评论 -
只出现一次的数字
只出现一次的数字1.题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:示例 2:2.思路任何一个数字和它自己异或都等于0,因此,把从头到尾异或数组中的每个数字,最后得到的结果就是只出现一次的数字。3.代码class Solution {...原创 2020-02-04 15:34:26 · 164 阅读 · 0 评论 -
平衡二叉树
平衡二叉树1.题目描述给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例 1:给定二叉树 [3,9,20,null,null,15,7]返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4]返回 false 。2.思路自底向上,提前阻断。从底向上...原创 2020-02-04 15:22:16 · 91 阅读 · 0 评论 -
二叉树的深度
二叉树的深度1.题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。2.思路二叉树的深度等于max(左子树的深度+1,右子树深度+1),因此可以递归地求出。3.代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *r...原创 2020-02-04 14:23:43 · 86 阅读 · 0 评论 -
二叉搜索树的第k个结点
二叉搜索树的第k个结点1.题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。2.思路二叉搜索树的中序遍历是递增序列,遍历i记录第几个节点,find记录是否找到,如果i == k则提前结束遍历。3.代码/*struct TreeNode { int val; struct Tre...原创 2020-02-04 14:02:58 · 83 阅读 · 0 评论 -
缺失数字
缺失数字1.题目描述给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。示例 1:示例 2:2.思路利用等差数列求和公式,求出0~n的和expectSum,再求出数组的和sum,两者相减即可得到缺失的数字。3.代码class Solution {public: int missingNumber(vector&l...原创 2020-02-04 13:35:37 · 209 阅读 · 0 评论 -
数字在排序数组中出现的次数
数字在排序数组中出现的次数1.题目描述统计一个数字在排序数组中出现的次数。2.思路二分法,分别找到第一个target的下标和最后一个的下标。1.找到第一个target的下标。 利用二分法找到target,再判断target是否是数组的第一个元素或者是否是多个target的第一个,如果不是,继续往前找,直到找到一个target。2.找到最后一个target的下标。 利用二分法找到...原创 2020-02-03 23:12:08 · 123 阅读 · 0 评论 -
两个链表的第一个公共结点
两个链表的第一个公共结点1.题目描述输入两个链表,找出它们的第一个公共结点。2.方法1计算两个链表的长度,并求出长度差diff,如果len1 > len2则链表1先走diff,然后两个链表同时走,直到两个节点相同,如果len1 < = len2则链表2先走diff,执行相同操作。3.代码/** * Definition for singly-linked list. *...原创 2020-02-03 17:24:21 · 79 阅读 · 0 评论 -
字符流中第一个不重复的字符
字符流中第一个不重复的字符1.题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果当前字符流没有存在出现一次的字符,返回#字符。2.思路字符只能一个一个从字符流中读出来,定义一个大小为256的数组作为字符哈希表保存字符...原创 2020-02-03 12:31:29 · 124 阅读 · 0 评论 -
第一个只出现一次的字符
第一个只出现一次的字符1.题目描述给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。案例:2.思路构建一个大小为256的数组作为哈希表来保存字符出现的次数,第一次遍历字符串记录每个字符出现的次数,第二次遍历字符串,遇到第一个只出现一次的字符,则返回他的索引。3.代码class Solution {public: int firstUni...原创 2020-02-03 11:56:59 · 116 阅读 · 0 评论 -
丑数
丑数1.题目描述编写一个程序,找出第 n 个丑数。丑数就是只包含质因数 2, 3, 5 的正整数。示例:说明:1.1 是丑数。2.n 不超过1690。2.思路动态规划:丑数是另外一个丑数乘以2,3,5的结果,从1开始,按递增顺序求出丑数。动态方程dp[i]=min(dp[p2]*2,dp[p3]*3,dp[p5]*5)1.根据动态方程,求出大于当前丑数的最小丑数newNum。...原创 2020-02-02 22:48:22 · 144 阅读 · 0 评论 -
最长不含重复字符的子字符串
最长不含重复字符的子字符串1.题目描述给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例 1:示例 2:示例 3:3.思路设置一个大小为128的数组记录字符的下标,子字符串的长度为j - i + 1。变量res记录当前最长不含重复字符的子字符串,变量j指向当前遍历的字符,如果j指向的字符重复出现,变量i更新为j+1,这样后面计算子字符串长度的时候就会忽略重复字符的...原创 2020-02-02 20:50:43 · 113 阅读 · 0 评论 -
礼物的最大价值
礼物的最大价值1.题目描述在一个m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿多少价值的礼物?2.思路动态规划:grid(i,j)=grid(i,j)+min(grid(i-1,j),grid(i,j-1))边界条件:1.在第...原创 2020-02-02 14:28:25 · 153 阅读 · 0 评论 -
把数字翻译成字符串
把数字翻译成字符串1.题目描述一条包含字母 A-Z 的消息通过以下方式进行了编码:给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:示例 2:2.思路利用动态规划1.dp[i]为s[0…i]的译码方法总数2.分情况讨论:(1)若s[i] = ‘0’,那么如果s[i-1]=‘1’ or ‘2’,则dp[i] = dp[i-2];否则返回0。解释:s[i-1]...原创 2020-02-01 23:10:36 · 157 阅读 · 0 评论 -
把数组排成最小的数
把数组排成最小的数1.题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。2.思路数组的两个数字m和n能拼接成数字mn和nm。如果mn < nm那么m应该排在n的前面,我们定义此时m小于n;反之,如果nm < mn,则我们定义n小于m。如果mn =...原创 2020-02-01 19:57:45 · 113 阅读 · 0 评论 -
整数中1出现的次数(从1到n整数中1出现的次数)
整数中1出现的次数(从1到n整数中1出现的次数)1.题目描述求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。2.方法1常规思路,统计区间中每个整数1的次数。3.代码class Solution {public: int NumberOf1Between1AndN_Solution(int n) { if(n <= 0){ ...原创 2020-02-01 19:15:01 · 251 阅读 · 0 评论 -
连续子数组的最大和
连续子数组的最大和1.题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组...原创 2020-01-31 22:41:07 · 88 阅读 · 0 评论 -
数据流的中位数
数据流的中位数1.题目描述中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。...原创 2020-01-31 16:44:19 · 169 阅读 · 0 评论 -
最小的K个数
最小的K个数1.题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。2.方法1(快排)基于partition,返回下标index,如果下标大于k-1,则从k-1往后继续执行partition,否则从0~k-1执行partition。直到index等于k-1。3.代码class Solution {publi...原创 2020-01-30 22:41:46 · 119 阅读 · 0 评论