
剑指Offer
牛客OJ题,简单的就不发了,仅作为自己的学习参考
hanmin822
个人Github地址:https://github.com/hanmin0822
展开
-
【剑指Offer】II. 二叉树的最近公共祖先
题目给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树:root =[3,5,1,6,2,0,8,null,null,7,4]思路上一题的变体,由于不是二叉搜索树了,所以就用后序遍历跑。题解:https://leetcode-cn.com/problems/er-...原创 2020-05-20 12:01:47 · 208 阅读 · 0 评论 -
【剑指Offer】I. 二叉搜索树的最近公共祖先
题目给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树:root =[6,2,8,0,4,7,9,null,null,3,5]思路循环。从根往下找,这样确保深度尽可能大。由于二叉搜索树的性质,如果一个节点与p、q相比,值一大于一小于,就说明他一定是p、...原创 2020-05-20 11:16:26 · 132 阅读 · 0 评论 -
【剑指Offer】把字符串转换成整数
题目写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如.原创 2020-05-19 11:24:06 · 252 阅读 · 1 评论 -
【剑指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]。不能使用除法。思路重点在于不能使用除法,因此可以像乘法表一样分上下三角乘。上三角乘的时候,本身处在一个循环中,用一个变量tmp来记录上次结果就可以。题解:https://leetcode-cn.com/problems/gou-jian-cheng-ji-shu-zu-lcof/solution/mi原创 2020-05-19 10:29:48 · 107 阅读 · 0 评论 -
【剑指Offer】不用加减乘除做加法
题目写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。思路位运算题,感觉自己好fw啊,这都有点看不懂题解:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/solution/wei-yun-suan-_mian-shi-ti-65-bu-yong-jia-jian-chen/代码class Solution {public:原创 2020-05-18 09:55:55 · 143 阅读 · 0 评论 -
【剑指Offer】求1+2+…+n
题目求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路不能使用乘数法,意味着我们不能直接代入公式去计算,那么考虑使用位运算或者加减法。使用位运算或者加减法的话,离不开多次做相同的事情,由于不能使用循环,那么这里要不使用递归要不把代码复制很多次。使用递归,又要做终止条件判断,由于不能用条件判断语句,就考虑到使用短路原则。使用加减法+递归+短路特性来做题。代码class Solu..原创 2020-05-18 09:24:15 · 150 阅读 · 0 评论 -
【剑指Offer】股票的最大利润
题目假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。示例 2:输入: [7,6,4,3,1]输出: 0解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。思路本来还想哈...原创 2020-05-17 09:32:44 · 244 阅读 · 1 评论 -
【剑指Offer】圆圈中最后剩下的数字
题目0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。思路这篇题解写的很好,能看懂https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/solution/huan-ge-j原创 2020-05-17 08:57:36 · 91 阅读 · 0 评论 -
【剑指Offer】扑克牌中的顺子
题目从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。思路不使用排序,理论上除0之外,五张牌只要有重复就不可能是顺子,故先排除。然后就是判断最大最小值,如果最大值-最小值+1 小于等于5的话,就是顺子,否则肯定也组不成顺子代码class Solution {public: bool isStraight(vector<int>&原创 2020-05-16 09:33:05 · 193 阅读 · 0 评论 -
【剑指Offer】n个骰子的点数
题目把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。思路初见就没弄懂题目什么意思,看题解也不是很明白,后来自己弄懂了。首先,n 枚骰子掷出的点数的范围是 [n, 6*n],根据排列组合,所有投掷的总可能性是这道题可以使用DP分解状态时,我们理解为每一次投掷一个骰子,然后把之前的结果加起来,用二维数组保存之前的状态,就可以避免原创 2020-05-16 09:19:06 · 176 阅读 · 0 评论 -
【剑指Offer】 II. 队列的最大值
题目请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value需要返回 -1思路再用一个队列来实现存最大值,因为只用一个int值来存最大值的话,出队的时候就不知道次大值了这篇题解质量很高,易懂:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/soluti.原创 2020-05-14 09:45:20 · 168 阅读 · 0 评论 -
【剑指Offer】I. 滑动窗口的最大值
题目给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1...原创 2020-05-14 09:21:24 · 144 阅读 · 0 评论 -
【剑指Offer】II. 左旋转字符串
题目字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。思路一行代码没什么好说的,复习substr用法:形式:s.substr(pos, n)解释:返回一个string,包含s中从pos开始的n个字符的拷贝(pos的默认值是0,n的默认值是s.size() - pos,即不加参数会默认拷贝整个s)代码class Solution原创 2020-05-13 09:09:22 · 150 阅读 · 0 评论 -
【剑指Offer】I. 翻转单词顺序
题目输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。思路C++没有这种库函数直接做分割,相比起来C#就爽得多,既然如此就直接硬写一个,没画图,脑子里直接想的,代码可能较乱,但就是直接思路。双指针的动态演示见题解:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof/solu原创 2020-05-13 08:59:15 · 133 阅读 · 0 评论 -
【剑指Offer】 II. 和为s的连续正数序列
题目输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。思路一开始没看到是连续的正整数序列,还是在想单纯的递增怎么能用滑动窗口。这题无疑滑动窗口最优解。这篇题解写的不错,也有证明:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/solution/shi-yao-shi-hua-d原创 2020-05-12 10:46:49 · 168 阅读 · 0 评论 -
【剑指Offer】和为s的两个数字
题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。思路1.可以用hash表存一下每个数字,其实找到两个数字之和 a+b = target,就相当于找到是否存在 target - b 这个数字。时间复杂度和空间复杂度均为 O(n)。2.双指针对撞题解(可行性证明):https://leetcode-cn.com/problems/he-wei-sde-liang-ge-shu-zi-lcof/solution原创 2020-05-12 10:30:08 · 126 阅读 · 0 评论 -
【剑指Offer】II. 数组中数字出现的次数 II
题目在一个数组nums中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。思路看一下题解,都上自动机了,就nm离谱。采用这个思路,虽然效率略低,但好理解。直接将代码修改成除了一个数字以外,其余数字都出现 k 次 的通用问题的解决方案题解见:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/mian-shi-ti-56-ii-..原创 2020-05-11 14:35:19 · 123 阅读 · 0 评论 -
【剑指Offer】I. 数组中数字出现的次数
题目一个整型数组nums里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路真的是失忆症患者了,这道题以前做过但竟然一点思路都没有。要考虑到位运算的用途:异或操作的性质:对于两个操作数的每一位,相同结果为 0,不同结果为 1。那么在计算过程中,成对出现的数字的所有位会两两抵消为 0,最终得到的结果就是那个出现了一次的数字。题解:https://leetcode-cn.com/problems/shu-..原创 2020-05-11 13:53:53 · 144 阅读 · 0 评论 -
【剑指Offer】II. 平衡二叉树
题目输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。思路见https://blog.csdn.net/hanmin822/article/details/106037299在此基础上稍加修改,总体思想还是后序遍历,注意一个比较和剪枝的过程题解:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/solution/mian-shi-ti-55原创 2020-05-10 16:42:23 · 117 阅读 · 0 评论 -
【剑指Offer】I. 二叉树的深度
题目输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。思路一个后序遍历,因为后序是左右根的顺序,所以比较左右的最大值再+1就是此树的深度。题解:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/solution/mian-shi-ti-55-i-er-cha-shu-de-shen-du-xian-xu-bia/代码/** * D原创 2020-05-10 15:58:19 · 138 阅读 · 0 评论 -
【剑指Offer】二叉搜索树的第k大节点
题目给定一棵二叉搜索树,请找出其中第k大的节点。思路主要是二叉搜索树的性质,中序遍历的倒序问题二叉搜索树的中序遍历倒序为递减序列。 因此,求 “二叉搜索树第k 大的节点” 可转化为求 “此树的中序遍历倒序的第k个节点” 。题解链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/solution/mian-shi-ti-54-er-cha-sou-suo-shu-de...原创 2020-05-09 09:35:05 · 151 阅读 · 0 评论 -
【剑指Offer】II. 0~n-1中缺失的数字
题目一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。思路两种思路都试一下,现在就能更明确力扣的判时就假的一批。二分法竟然比顺序找还慢重点说下二分法的思路算法解析:初始化: 左边界 i = 0,右边界 j = len(nums) - 1;代表闭区间 [i, j]。 循环二分: 当 i≤j 时循环 (即当闭区间 [i, j] 为空时跳出) ; 计算中点 m =原创 2020-05-09 08:48:54 · 207 阅读 · 0 评论 -
【剑指Offer】在排序数组中查找数字 I
题目统计一个数字在排序数组中出现的次数。思路两次二分,先找右边界,再找左边界,最后答案就是右-左-1代码class Solution {public: int search(vector<int>& nums, int target) { int len = nums.size(); int i = 0; ...原创 2020-05-07 14:58:00 · 124 阅读 · 0 评论 -
【剑指Offer】两个链表的第一个公共节点
题目输入两个链表,找出它们的第一个公共节点。思路双指针方法,两个指针同时走,到了末尾就变成另一个链表的头,最终相遇点就是交叉点代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x)...原创 2020-05-07 14:41:28 · 116 阅读 · 0 评论 -
【剑指Offer】数组中的逆序对
题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。思路直接上了个力扣的代码,自己写了较详细的注释。题解:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/solution/shu-zu-zhong-de-ni-xu-dui-by...原创 2020-05-06 19:35:42 · 183 阅读 · 0 评论 -
【剑指Offer】第一个只出现一次的字符
题目在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。思路直接见代码了,这题很简单,继续复习map的应用,记得哈希表的时间复杂度是O(1)代码class Solution {public: char firstUniqChar(string s) { map<char,int> m; ...原创 2020-05-06 15:15:12 · 124 阅读 · 0 评论 -
【剑指Offer】丑数
题目我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。思路将前面求得的丑数记录下来,后面的丑数就是前面的丑数*2,*3,*5采取用三个指针的方法p2,p3,p5p2指向的数字下一次永远*2,p3指向的数字下一次永远*3,p5指向的数字下一次永远*5从2*p2 3*p3 5*p5选取最小的一个数字,作为第k个丑数如果第K...原创 2020-05-05 09:48:31 · 117 阅读 · 0 评论 -
【剑指Offer】最长不含重复字符的子字符串
题目请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。思路使用滑动窗口+优化详细动态理解图见https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/solution/tu-jie-hua-dong-chuang-kou-shuang-z...原创 2020-05-05 08:20:14 · 108 阅读 · 0 评论 -
【剑指Offer】礼物的最大价值
题目在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?思路直接动态规划了,主要是要写出状态转移方程代码class Solution {public: int max(in...原创 2020-05-01 11:45:44 · 118 阅读 · 0 评论 -
【剑指Offer】把数字翻译成字符串
题目给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路这道题抽象为树模型后就是:求一颗二叉树从根结点到达叶子结点的路径总数。因为每次可能的选择都只有两个,犹如二叉树的两个分支。栗如:对于数字 13...转载 2020-04-30 09:21:48 · 157 阅读 · 0 评论 -
【剑指Offer】把数组排成最小的数
题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: "102"示例2:输入: [3,30,34,5,9]输出: "3033459"思路自定义排序,一个字符串的字典序排序排序判断规则: 设 nums 任意两数字的字符串格式 x 和 y,则若拼接字符串 x + y > y + ...原创 2020-04-30 08:51:16 · 172 阅读 · 0 评论 -
【剑指Offer】数字序列中某一位的数字
题目数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。思路意思大概是这么个意思,但是轮到自己写的时候总是出错,不知道为啥,于是改了种方法,就是n为两位数以上的时候直接先减9,免得0干扰。代码class Solution ...原创 2020-04-29 20:48:39 · 226 阅读 · 0 评论 -
【剑指Offer】1~n整数中1出现的次数
题目输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。思路我们假设高位为high,当前位为cur,低位为low,i代表着需要统计的位置数(1对应个位,10对应十位,100对应百位),则对每一位的个数count有:cur=0,count = high*i;cur=1,coun...原创 2020-04-28 21:52:48 · 206 阅读 · 0 评论 -
【剑指Offer】连续子数组的最大和
题目输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。思路DP是我一生之敌。直接见这篇题解的思路,就比较清晰了https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/solution/mian-shi-ti-4...原创 2020-04-27 10:27:00 · 128 阅读 · 0 评论 -
【剑指Offer】数据流中的中位数
题目如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4]的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中...原创 2020-04-27 09:29:16 · 220 阅读 · 0 评论 -
【剑指Offer】最小的k个数
题目输入整数数组arr,找出其中最小的k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。思路最直接的肯定是sort+前k位输出(貌似这样在力扣上还省时一点)研究了一下书上的方法,用一个STL容器完成,维持一个容量为k的堆,保证这个堆中的数据都是最小的。代码class Solution {public: vect...原创 2020-04-26 11:45:57 · 189 阅读 · 0 评论 -
【剑指Offer】数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。思路第一想法是哈希表来存出现次数,遇到超过一半的就直接退出循环。后来看到更好的思路,就是投票法。题解https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban...原创 2020-04-26 11:04:22 · 109 阅读 · 0 评论 -
【剑指Offer】字符串的排列
题目输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]思路先使用书上的方法来进行排列但是会出现重复,于是直接思路就是用set去重但是可见非常耗时于是对代码思路进行优化,注释如下代码...原创 2020-04-25 10:02:15 · 100 阅读 · 0 评论 -
【剑指Offer】序列化二叉树
题目请实现两个函数,分别用来序列化和反序列化二叉树。示例:你可以将以下二叉树: 1 / \ 2 3 / \ 4 5序列化为 "[1,2,3,null,null,4,5]"思路使用队列+循环实现本题主要还是对字符串的处理过程,使用stream对象来操作字符串,单独写一个读入处理的函数代码/** * Definit...原创 2020-04-25 08:54:32 · 105 阅读 · 0 评论 -
【剑指Offer】二叉搜索树与双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。思路首先思路还是中序遍历完了直接存一vector再弄,但是题目有要求就地完成。使用一个“上一个”节点来记录,这样...原创 2020-04-23 20:28:23 · 85 阅读 · 0 评论