剑指offer
剑指offer刷题笔记
probeTS
这个作者很懒,什么都没留下…
展开
-
[剑指offer] 数字排列
数字排列 题目 输入一组数字(可能包含重复数字),输出其所有的排列方式。 样例 输入:[1, 2, 3] 输出: [ [1, 2, 3], [1, 3, 2], [2, 1, 3],...原创 2020-03-04 20:50:14 · 167 阅读 · 0 评论 -
[剑指offer] 0到n-1中缺失的数字
0到n-1中缺失的数字 题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。 在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 样例 输入:[0,1,2,4] 输出:3 题解一 思路 枚举法 注意 当所有数都满足 nums[i] == i 时,表示缺失的是 n class Solution { public: ...原创 2020-02-25 09:35:09 · 138 阅读 · 0 评论 -
[剑指offer] 数组中数值和下标相等的元素
数组中数值和下标相等的元素 题目 假设一个单调递增的数组里的每个元素都是整数并且是唯一的。 请编程实现一个函数找出数组中任意一个数值等于其下标的元素。 例如,在数组[-3, -1, 1, 3, 5]中,数字3和它的下标相等。 注意:如果不存在,则返回-1。 输入样例 输入:[-3, -1, 1, 3, 5] 输出:3 题解 思路 二分法 class Solution { public: ...原创 2020-02-24 17:40:11 · 220 阅读 · 0 评论 -
[剑指offer]字符流中第一个只出现一次的字符
字符流中第一个只出现一次的字符 题目 请实现一个函数用来找出字符流中第一个只出现一次的字符。 例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是’g’。 当从该字符流中读出前六个字符”google”时,第一个只出现一次的字符是’l’。 如果当前字符流没有存在出现一次的字符,返回#字符。 样例 输入:“google” 输出:“ggg#ll” 解释:每当字符流读入一个字符,就进行...原创 2020-02-08 20:08:37 · 151 阅读 · 0 评论 -
[剑指offer]最长不含重复字符的子字符串
最长不含重复字符的子字符串 题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 假设字符串中只包含从’a’到’z’的字符。 样例 输入:“abcabc” 输出:3 题解 双指针算法 i、j 维护相关不重复的子串 class Solution { public: int longestSubstringWithoutDuplication(strin...原创 2020-02-08 16:33:03 · 80 阅读 · 0 评论 -
[剑指offer]把数组排成最小的数
把数组排成最小的数 题目 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 例如输入数组[3, 32, 321],则打印出这3个数字能排成的最小数字321323。 注意 输出数字的格式为字符串。 样例 输入:[3, 32, 321] 输出:321323 题解 编写一个比较器函数cmp class Solution { public: stat...原创 2020-02-01 19:26:16 · 132 阅读 · 0 评论 -
[剑指offer]把数字翻译成字符串
把数字翻译成字符串 题目 给定一个数字,我们按照如下规则把它翻译为字符串: 0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。 一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。 请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。 样例 输入:“12258” 输出:5 题...原创 2020-02-01 19:10:19 · 120 阅读 · 0 评论 -
[剑指offer]丑数
丑数 题目 我们把只包含质因子2、3和5的数称作丑数(Ugly Number)。 例如6、8都是丑数,但14不是,因为它包含质因子7。 求第n个丑数的值。 注意 习惯上我们把1当做第一个丑数。 样例 输入:5 输出:5 题解 思路 这题可以理解为求只包含2,3,5质数因为的数的从小到大的集合 第一路是包含质因子2的所有数的集合,第二路是包含3的质因子的所有数的集合,第三路是包含5的质因子的所...原创 2020-02-01 17:16:07 · 192 阅读 · 0 评论 -
[剑指offer]数据流中的中位数
数据流中的中位数 题目 如何得到一个数据流中的中位数? 如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。 如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 样例 输入:1, 2, 3, 4 输出:1, 1.5, 2, 2.5 解释:每当数据流读入一个数据,就进行一次判断并输出当前的中位数。 题解 利用大根堆存储前 n / 2 到 n ...原创 2020-02-01 16:08:32 · 150 阅读 · 0 评论 -
[剑指offer]0到n-1中缺失的数字
0到n-1中缺失的数字 题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。 在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 样例 输入:[0, 1, 2, 4] 输出:3 题解 如果该数字在数组中的和为 n * (n + 1) / 2,那么,该数字在数组中的和减去该数字不在数组中的和即为该数字 class Solutio...原创 2020-02-01 15:20:09 · 194 阅读 · 0 评论 -
[剑指offer]股票的最大利润
股票的最大利润 题目 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖 一次 该股票可能获得的利润是多少? 例如一只股票在某些时间节点的价格为[9, 11, 8, 5, 7, 12, 16, 14]。 如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。 样例 输入:[9, 11, 8, 5, 7, 12, 16, 14] 输出:11 题解 当天股票价值减去之...原创 2020-02-01 14:56:40 · 144 阅读 · 0 评论 -
[剑指offer]不用加减乘除做加法
不用加减乘除做加法 题目 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷ 四则运算符号。 样例 输入:num1 = 1 , num2 = 2 输出:3 题解 思路 两个整数做异或运算 ^,得到各位相加不进位的运算结果 两个整数做与运算 &,然后再左移一位,即得到进位的运算结果 将上面两个结果相加,再重复步骤 1 和 2,直至进位的运算结果为0 class Solu...原创 2020-02-01 11:47:34 · 101 阅读 · 0 评论 -
[剑指offer]滑动窗口的最大值
滑动窗口的最大值 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。 例如,如果输入数组[2, 3, 4, 2, 6, 2, 5, 1]及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为[4, 4, 6, 6, 6, 5]。 注意 数据保证k大于0,且k小于等于数组长度。 样例 输入:[2, 3, 4, 2, 6, 2, 5, 1] , k=3 输出: [4, 4,...原创 2020-02-01 11:22:37 · 109 阅读 · 0 评论 -
[剑指offer]圆圈中最后剩下的数字
圆圈中最后剩下的数字 题目 0, 1, …, n-1这n个数字(n>0)排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。 求出这个圆圈里剩下的最后一个数字。 样例 输入:n=5 , m=3 输出:3 题解 约瑟夫环问题 class Solution { public: int lastRemaining(int n, int m){ if (n == 1...原创 2020-01-31 19:47:41 · 138 阅读 · 0 评论 -
[剑指offer]树中两个结点的最低公共祖先
树中两个结点的最低公共祖先 题目 给出一个二叉树,输入两个树节点,求它们的最低公共祖先。 一个树节点的祖先节点包括它本身。 注意 输入的二叉树不为空; 输入的两个节点一定不为空,且是二叉树中的节点; 样例 二叉树 [8, 12, 2, null, null, 6, 4, null, null, null, null] 如下图所示: 8 &nb...原创 2020-01-31 17:23:19 · 207 阅读 · 0 评论 -
[剑指offer]数组中只出现一次的两个数字
和为S的连续正数序列 题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次。 请写程序找出这两个只出现一次的数字。 你可以假设这两个数字一定存在。 样例 输入:[1, 2, 3, 3, 4, 4] 输出:[1, 2] 题解 原理 两个相同的数字相异或后为 0 思路 将所给序列中的所有数进行异或运算得到结果 sum 随机取 sum 中第 tag 位为1的数,并记录 tag 将所给序...原创 2020-01-31 16:33:36 · 142 阅读 · 0 评论 -
[剑指offer]和为S的连续正数序列
和为S的连续正数序列 题目 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。 样例 输入:15 输出:[[1,2,3,4,5],[4,5,6],[7,8]] 题解 双指针算法 设置两个指针i和j,分别指向连续正数序列的起始和终止 当当前和 s == sum时,...原创 2020-01-31 15:30:16 · 128 阅读 · 0 评论 -
[剑指offer]复杂链表的复刻
复杂链表的复刻 题目 请实现一个函数可以复制一个复杂链表。 在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。 注意 函数结束后原链表要与输入时保持一致。 样例 输入:[[1, 1], [0, 2], [1, 4], [3, -1], [3, 2]] 输出:[[1, 1], [0, 2], [1, 4], [3, -1], [3, 2]...原创 2020-01-31 11:20:41 · 202 阅读 · 0 评论 -
[剑指offer]二叉搜索树与双向链表
二叉搜索树与双向链表 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 要求不能创建任何新的结点,只能调整树中结点指针的指向。 注意 需要返回双向链表最左侧的节点。 样例 输入下图中左边的二叉搜索树,则输出右边的排序双向链表。 题解 通过中序遍历构造单链表,然后,当单链表构造完成后,再构造双向链表 /** * Definition for a binary tree no...原创 2020-01-31 10:43:41 · 173 阅读 · 0 评论 -
[剑指offer]二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。 如果是则返回true,否则返回false。 假设输入的数组的任意两个数字都互不相同。 样例 输入:[4, 8, 6, 12, 16, 14, 10] 输出:true 题解 以二叉搜索树根节点为界,根节点左边的必然都小于根节点,根节点右边的必然都大于根节点,如果违背该原则,则说明该数组不是某二叉搜索...原创 2020-01-31 10:15:18 · 139 阅读 · 0 评论 -
[剑指offer]两个链表的第一个公共结点
两个链表的第一个公共结点 题目 输入两个链表,找出它们的第一个公共结点。 当不存在公共节点时,返回空节点。 样例 给出两个链表如下所示: A: a1 → a2 &nb...原创 2020-01-30 15:55:10 · 140 阅读 · 0 评论 -
[剑指offer]连续子数组的最大和
连续子数组的最大和 题目 输入一个 非空 整型数组,数组里的数可能为正,也可能为负。 数组中一个或连续的多个整数组成一个子数组。 求所有子数组的和的最大值。 要求时间复杂度为O(n)。 样例 输入:[1, -2, 3, 10, -4, 7, 2, -5] 输出:18 题解 思路 如果当前数前面的最大序列和sum小于0,故当前数加上sum为负收益,则将sum归为0,再加上当前数 如果当前数前面...原创 2020-01-30 15:01:41 · 124 阅读 · 0 评论 -
[剑指offer]最小的k个数
最小的k个数 题目 输入n个整数,找出其中最小的k个数。 注意 数据保证k一定小于等于输入数组的长度; 输出数组内元素请按从小到大顺序排序; 样例 输入:[1,2,3,4,5,6,7,8] , k=4 输出:[1,2,3,4] 题解1 排序即可 class Solution { public: vector<int> getLeastNumbers_Solution(v...原创 2020-01-30 11:43:04 · 111 阅读 · 0 评论 -
[剑指offer]二叉树中和为某一值的路径
二叉树中和为某一值的路径 题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。 从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 样例 给出二叉树如下所示,并给出num=22。 5 / \ &nb...原创 2020-01-30 10:56:09 · 129 阅读 · 0 评论 -
[剑指offer]之字形打印二叉树
分行从上往下打印二叉树 题目 从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。 样例 输入如下图所示二叉树 [8, 12, 2, null, null, 6, null, 4, null, null, null] 8 / \ 12 ...原创 2020-01-30 09:55:11 · 116 阅读 · 0 评论 -
[剑指offer]顺时针打印矩阵
顺时针打印矩阵 题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 样例 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出:[1,2,3,4,8,12,11,10,9,5,6,7] 题解 首先,使用一个布尔数组...原创 2020-01-29 22:32:08 · 117 阅读 · 0 评论 -
[剑指offer]树的子结构
树的子结构 题目 输入两棵二叉树A,B,判断B是不是A的子结构。 我们规定空树不是任何树的子结构。 样例 树A: 8 / \ 8 7 / \  ...原创 2020-01-29 19:40:19 · 104 阅读 · 0 评论 -
[剑指offer]调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序。 使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。 样例 输入:[1,2,3,4,5] 输出:[1,3,5,2,4] 题解 双指针算法,i 指针指向数组头,j 指针指向数组尾,j 指针遇到奇数停止递减,i 指针遇到偶数停止递增,然后交换两个指针所指向的数值,不断迭代至两指针相遇 cl...原创 2020-01-29 16:50:10 · 475 阅读 · 0 评论 -
[剑指offer]二进制中1的个数
二进制中1的个数 题目 输入一个32位整数,输出该数二进制表示中1的个数。 注意: 负数在计算机中用其绝对值的补码来表示。 样例1 输入:9 输出:2 解释:9的二进制表示是1001,一共有2个1。 样例2 输入:-2 输出:31 解释:-2在计算机里会被表示成11111111111111111111111111111110 一共有31个1。 题解 由于负数右移高位自动补1,故如果直接...原创 2020-01-29 15:44:17 · 263 阅读 · 0 评论 -
[剑指offer]剪绳子
剪绳子 题目 给你一根长度为 n 绳子,请把绳子剪成 m 段(m、n 都是整数,2≤n≤58 并且 m≥2)。 每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]k[1] … k[m] 可能的最大乘积是多少? 例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。 样例 输入:8 输出:18 题解 原理 当 n < 5 时,由于至少切成...原创 2020-01-29 15:23:11 · 181 阅读 · 0 评论 -
[剑指offer]不修改数组找出重复的数字
不修改数组找出重复的数字 题目 给定一个长度为 n+1 的数组nums,数组中所有的数均在 1∼n 的范围内,其中 n≥1。 请找出数组中任意一个重复的数,但不能修改输入的数组。 样例 给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。 返回 2 或 3。 思考题:如果只能使用 O(1) 的额外空间,该怎么做呢? 题解 利用unordered_map的count方法,来判断...原创 2020-01-28 10:50:36 · 212 阅读 · 0 评论 -
[剑指offer]二维数组中的查找
二维数组中的查找 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 样例 输入数组: [ [1,2,8,9], [2,4,9,12], &n...原创 2020-01-28 16:24:43 · 189 阅读 · 0 评论 -
[剑指offer]重建二叉树(根据前序中序得到二叉树)
重建二叉树 题目 输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。 注意: 二叉树中每个节点的值都互不相同; 输入的前序遍历和中序遍历一定合法; 样例 给定: 前序遍历是:[3, 9, 20, 15, 7] 中序遍历是:[9, 3, 15, 20, 7] 返回:[3, 9, 20, null, null, 15, 7, null, null, null, null] 返回的二叉树如下...原创 2020-01-28 17:26:26 · 1243 阅读 · 0 评论 -
[剑指offer]二叉树的下一个节点
二叉树的下一个节点 题目 给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。 注意: 如果给定的节点是中序遍历序列的最后一个,则返回空节点; 二叉树一定不为空,且给定的节点一定不是空节点; 样例 假定二叉树是:[2, 1, 3, null, null, null, null], 给出的是值等于2的节点。 则应返回值等于3的节点。 解释:该二叉树的结构如下,2的后继节点是3。 &n...原创 2020-01-28 21:48:36 · 433 阅读 · 0 评论 -
[剑指offer]矩阵中的路径
矩阵中的路径 题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。 如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 注意: 输入的路径不为空; 所有出现的字符均为大写英文字母; 样例 matrix= [ [“A”,“...原创 2020-01-29 10:40:27 · 255 阅读 · 0 评论 -
[剑指offer]机器人的运动范围
机器人的运动范围 题目 地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。 一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。 但是不能进入行坐标和列坐标的数位之和大于 k 的格子。 请问该机器人能够达到多少个格子? 注意: 0<=m<=50 0<=n<=50 0<=k<=100 样例1 输...原创 2020-01-29 11:57:54 · 1031 阅读 · 0 评论