剑指offer
Kobe Forever
自信乐观,善待他人,善待自己!
展开
-
剑指offer 面试题68 II 二叉树的最近公共祖先
问题:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”思路:第一步,找到根到两个节点的路径第二步,找到两个路径的最后一个公共节点代码:/** * Definition ...原创 2020-04-07 17:38:19 · 133 阅读 · 0 评论 -
剑指offer 面试题63 股票的最大利润
问题:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?思路:保存最小值,将当前值与最小值做差,如果大于最大利润,则更新最大利润。遍历结束,得到最大利润。代码:class Solution {public: int maxProfit(vector<int>& prices) { int min=...原创 2020-04-04 18:37:58 · 257 阅读 · 0 评论 -
剑指offer 面试题62 圆圈中最后剩下的数字
问题:0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。思路1:环形链表模拟圆圈复杂度分析:时间复杂度为O(mn),空间复杂度为O(n).思路2:分析每次被删除的数字的规...原创 2020-04-04 18:21:24 · 107 阅读 · 0 评论 -
剑指offer 面试题61 扑克牌中的顺子
问题:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。思路1:排序把数组排序,统计数组中0的个数,统计排序之后的数组中相邻数字之间的空缺总数。如果空缺总数小于等于0的个数,则是顺子,否则不是。另外,如果有对子出现,则不是顺子。代码:cla...原创 2020-04-04 17:55:42 · 274 阅读 · 2 评论 -
剑指offer 面试题60 n个骰子的点数
问题:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。(1 <= n <= 11)思路1:递归将n个骰子分为1和n-1两堆,n-1又可以进行递归,递归结束条件最后只剩下1个。代码:class Solution {public: double total; void probabilityCore(int ...原创 2020-04-04 16:59:23 · 272 阅读 · 0 评论 -
剑指offer 面试题59 队列的最大值
问题1:滑动窗口的最大值给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。思路:利用deque存放滑动窗口中有可能成为最大值的索引值。从deque后面依次弹出比当前num[i]小的值,保证deque队首元素为当前窗口最大值索引,压入nums[i]。当当前窗口滑过窗口最大值索引时,弹出最大值索引。代码:class Solution {publi...原创 2020-03-30 21:50:44 · 893 阅读 · 0 评论 -
剑指offer 面试题58 翻转字符串
问题1:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。思路:翻转整个句子,然后翻转每个单词。代码:class Solution {public: string ReverseSentence(string str) { ...原创 2020-03-30 18:13:42 · 130 阅读 · 0 评论 -
剑指offer 面试题57 和为s的数字
问题1:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。思路:两个指针,由于是排序数组,初始时分别指向头和尾。如果指针指向的两个数的和大于s,则j减一;小于s,i加一;等于s,则返回结果。循环结束条件i>=j。代码:class Solution {public: vector<...原创 2020-03-30 15:38:00 · 202 阅读 · 0 评论 -
剑指offer 面试题56 数组中数字出现的次数
问题1:数组中只出现一次的两个数字一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。2 <= nums <= 10000思路:异或首先,对数组的每个数字依次进行异或,得到异或后的结果value。然后,记value最右边第一位为1的位为i,依据第i位为1/0将数组分为两组。最后,在每个子数组中,依次进行异或,异或后的结果...原创 2020-03-29 00:12:01 · 204 阅读 · 0 评论 -
剑指offer 面试题55 二叉树的深度
问题:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:递归树的深度为左子树的深度和右子树的深度的较大值+1.代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x...原创 2020-03-28 22:18:36 · 118 阅读 · 0 评论 -
剑指offer 面试题54 二叉搜索树的第K大节点
问题:给定一棵二叉搜索树,请找出其中第k大的节点。思路:中序遍历代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { ...原创 2020-03-28 20:43:20 · 130 阅读 · 0 评论 -
剑指offer 面试题53 在排序数组中查找数字
问题1:统计一个数字在排序数组中出现的次数。输入:数组输出:次数思路:由于在排序数组中,可以使用二分查找。(注意加1减1细节。)代码:class Solution {public: int getFirst(vector<int>& nums, int target,int len,int start,int end) { ...原创 2020-03-28 16:24:43 · 120 阅读 · 0 评论 -
剑指offer 面试题52 两个链表的第一个公共节点
问题:输入两个链表,找出它们的第一个公共结点。输入:两个链表头指针输出:思路1:经过观察,两个链表在第一个公共节点汇合,如下图想从最后往前遍历,但由于是单向链表,所以借助栈。分别把两个链表放入栈中,两个链表的尾节点就位于两个栈的栈顶,接下来比较两个栈顶的节点是否相同,如果相同,则把栈顶弹出,比较新的栈顶,直到找到最后一个相同的节点。复杂度分析:时间复杂度为O(m+n),...原创 2020-03-26 23:18:08 · 271 阅读 · 0 评论 -
剑指offer 面试题51 数组中的逆序对
问题:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入:数组输出:逆序对总数思路:分治先把数组分成子数组,统计出子数组内部的逆序对数目,然后再统计出两个相邻子数组之间的逆序对数目。还需要对数组进行排序。基于归并排序写出以下...原创 2020-03-26 21:23:55 · 121 阅读 · 0 评论 -
剑指offer 面试题50 第一个只出现一次的字符
问题1:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).输入:字符串输出:第一个只出现一次的字符位置思路:创建一个数组,存放字符出现的次数代码:class Solution {public: int FirstNotRepeatingChar(str...原创 2020-03-26 17:46:48 · 124 阅读 · 0 评论 -
剑指offer 面试题49 丑数
问题:把只包含质因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第N个丑数。输入:N输出:第N个丑数思路:动态规划因为所有的丑数都是由2,3,5相乘得到的,因此创建数组存放中间的结果。设立三个指针,分别标识丑数要乘以的因子2,3,5。从第一个丑数1开始,每次将三个因子指向的丑数与三个因子相乘取最小,得到新的丑数。并将响应因子指针加一。代码:创建数组...原创 2020-03-26 16:56:30 · 144 阅读 · 0 评论 -
剑指offer 面试题48 最长不含重复字符的子字符串
问题:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。输入:字符串输出:最长子字符串的长度思路:动态规划定义f(i)表示以第i个字符为结尾的不包含重复字符的子字符串的最长长度。代码:复杂度分析:...原创 2020-03-26 12:06:59 · 380 阅读 · 0 评论 -
剑指offer 面试题47 礼物的最大价值
问题:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物。输入:价值矩阵输出:最大价值思路:动态规划定义f(i,j)为到达i,j的最大价值总和代码:辅助的二维数组存放中间结果,以空...原创 2020-03-25 20:41:15 · 748 阅读 · 0 评论 -
剑指offer 面试题46 把数字翻译成字符串
问题:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。输入:数字输出:翻译方法的总数思路:定义f(i)为自第i位开始的不同翻译的数目,那么当第i位和第i+1位组合起来在10~25时,g(i,i+...原创 2020-03-25 20:09:08 · 107 阅读 · 0 评论 -
剑指offer 面试题45 把数组排成最小的数
问题:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。输入:正整数数组输出:拼接后的字符串(输出结果可能非常大,所以你需要返回一个字符串而不是整数)思路:定义比较两个数字m,n大小的新规则,若mn<nm,则m<n,若nm<mn,则n<m。代码:class Solution {public: stat...原创 2020-03-25 19:40:18 · 87 阅读 · 0 评论 -
剑指offer 面试题44 数字序列中某一位的数字
问题:在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字。输入:n输出:数字思路:判断是几位数确定对应着的数值target确定返回值是target中的哪个位代码:class Solution {public: int countOfIntegers(int digits) {...原创 2020-03-25 19:01:13 · 109 阅读 · 0 评论 -
剑指offer 面试题43 1~n整数中1出现的次数
问题:输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数。输入:n输出:1出现的次数思路:将所有的数字分为两段,1~1345和1346~21345.1、先处理1346~21345中1出现的次数。分为:1在最高位的情况,1出现在除最高位之外的其他4位数中的情况。2、再处理1~1345中1出现的次数,可用递归求得。代码:class Solution {pu...原创 2020-03-25 16:11:28 · 133 阅读 · 0 评论 -
剑指offer 面试题42 连续子数组的最大和
问题:输入一个整数数组,既有正数,又有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。输入:数组vector<int> array输出:和最大值int思路:贪心,从前向后遍历数组,当子数组和小于0时,抛弃掉前面的子数组。同时,设置maxSum保存子数组的和的最大值。动态规划,f(i)表示以i结尾的子数组的和的最大值,递归公式如下:代码...原创 2020-03-25 11:18:16 · 125 阅读 · 0 评论 -
剑指offer 面试题41 数据流中的中位数
问题:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。输入:...原创 2020-03-24 01:12:19 · 68 阅读 · 0 评论 -
剑指offer 面试题40 最小的K个数
问题:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,输入:数组,K输出:最小的K个数思路:思路一(可以修改数组)基于Partition函数思路二基于priority_queue(大顶堆)时间复杂度为class Solution {public: vector<int> Get...原创 2020-03-22 17:00:46 · 191 阅读 · 0 评论 -
剑指offer 面试题39 数组中出现次数超过一半的数字
问题:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。输入:数组输出:寻找的数思路:第一种思路(会修改原数组),基于寻找的数如果存在,一定为中位数,时间复杂度为比较Partition的返回值index和middle,...原创 2020-03-22 15:53:54 · 122 阅读 · 0 评论 -
剑指offer 面试题38 字符串的排列
问题:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。输出:所有排列vector<string>思路:将字符串分成两部分,第一个,和第二个到末尾。然后第二个到末尾又可以分为两...原创 2020-03-22 11:36:38 · 242 阅读 · 0 评论 -
剑指offer 面试题37 序列化二叉树
问题:请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到...原创 2020-03-21 22:28:25 · 151 阅读 · 0 评论 -
剑指offer 面试题36 二叉搜索树与双向链表
问题:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。输入:二叉搜索树的头节点输出:排序的双向链表的头结点思路:中序遍历二叉搜索树,然后将左子树的最大节点与根节点相连,右子树的最小节点与根节点相连。左子树的最大节点可由已转换链表的最后一个节点(lastNode变量)得到。代码:/*struct Tre...原创 2020-03-21 17:38:45 · 86 阅读 · 0 评论 -
剑指offer 面试题35 复杂链表的复制
问题:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任一意个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)输入:复杂链表的头结点输出:复制后复杂链表的head思路:方法一:分两步(时间复杂度O(n),空间复杂度O(n))第一步,复制原始链表上的每个节点N创建N‘,...原创 2020-03-21 16:40:58 · 116 阅读 · 0 评论 -
剑指offer 面试题34 二叉树中和为某一值的路径
问题:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)输入:二叉树头节点,某一值输出:所有路径vector<vector<int>> path思路:代码:复杂度分析:...原创 2020-03-21 11:12:30 · 82 阅读 · 0 评论 -
剑指offer 面试题32 从上到下打印二叉树
问题:从上往下打印出二叉树的每个节点,同层节点从左至右打印。输入:TreeNode* root输出:vector<int> result思路:利用STL中的deque,保存节点,前面出,后面进。代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; ...原创 2020-03-20 19:00:40 · 81 阅读 · 0 评论 -
剑指offer 面试题31 栈的压入、弹出序列
问题:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)输入:vector<int> pushV,vector<int>...原创 2020-03-20 17:54:59 · 151 阅读 · 0 评论 -
剑指offer 面试题30 包含min函数的栈
问题:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。输入:类输出:类中的成员函数实现思路:设计一个辅助栈,入栈时,将数与辅助栈的栈顶数字相比较,如果数大于栈顶数,则保存栈顶数字到辅助栈。否则,将数保存于辅助栈,同时更新最小值。代码:...原创 2020-03-20 16:38:42 · 181 阅读 · 0 评论 -
剑指offer 面试题29 顺时针打印矩阵
问题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.输入:vector<vector<int> > matrix输出:vector<int...原创 2020-03-20 16:01:34 · 72 阅读 · 0 评论 -
剑指offer 面试题28 对称的二叉树
问题:判断一颗二叉树是不是对称的输入:二叉树的头结点指针输出:是否为对称思路:设计一个对称的前序遍历算法:先根节点,再右子节点,最后左子节点。将遍历节点值保存再数组中。通过比较前序遍历序列和对称前序遍历序列来判断二叉树是不是对称的。但是,这种算法容易漏掉树的所有节点值相同,但其结构并非是对称的。因此,考虑将遍历到的nullptr也考虑进来。代码:/*struct Tre...原创 2020-03-13 12:17:05 · 108 阅读 · 0 评论 -
剑指offer 面试题27 二叉树的镜像
问题:操作给定的二叉树,将其变换为源二叉树的镜像。输入:二叉树的头节点。输出:无思路:递归法。前序遍历二叉树。如果遍历到的节点有子节点,则交换它的两个子节点。当交换完所有非叶节点的左、右子节点之后,就得到了树的镜像。代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *rig...原创 2020-03-13 00:16:15 · 73 阅读 · 0 评论 -
剑指offer 面试题26 树的子结构
问题:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)输入:两颗二叉树的根节点指针输出:是否为子结构思路:第一步,在A树中查找与B树根节点值相同的节点第二步,判断A中以pRootB为根节点的子树是否与B具有相同的结构代码:/*struct TreeNode { int val; struct TreeNode...原创 2020-02-27 17:59:41 · 130 阅读 · 0 评论 -
剑指offer 面试题25 合并两个排序的链表
问题:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则输入:两个链表的头结点指针输出:合并后的链表头节点指针思路:代码:复杂度分析...原创 2020-02-27 16:43:32 · 155 阅读 · 0 评论 -
剑指offer 面试题24 反转链表
问题:输入一个链表,反转链表后,输出新链表的表头。输入:链表头节点输出:新链表的表头思路:如上图,可以一个一个地把链表节点的next指针修改,注意的是,在修改之后,链表节点无法访问到之前的next指针指向的节点,必须要在修改指针前将其保存下来。分析一下:需要一个指针进行链表的遍历;需要一个指针保存h,以便i指向h;需要一个指针保存i的下一个节点j。共需要三个指针,分别指...原创 2020-02-26 17:26:47 · 140 阅读 · 0 评论