剑指offer
903419
这个作者很懒,什么都没留下…
展开
-
构建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。leetcode链接1. 递归创建思路:记录当前前序遍历和中序遍历值所在的位置;对于根节点左子树来说,在中序遍历根节点的左侧,即在中序遍历数组中,其左子树继续在创建时,查看是否到了根节点值的位置;对于根节点右子树来说,在中序遍历根节点的右侧,即在中序遍历数组中,其右子树继续在创建时,只需要查看是否前序遍历数组是否越界。class Solution {public:原创 2021-03-25 18:06:54 · 144 阅读 · 0 评论 -
圆圈中最后剩下的数字
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经典的约瑟夫环问题。最后一个人剩下的原创 2021-03-12 20:21:48 · 104 阅读 · 0 评论 -
股票的最大利润
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?思路:一个遍历,挨次寻找最小值,若当前股票价格大于最小值,则求利润,并对当前利润进行保存,后续再进行 如上操作。class Solution {public: int maxProfit(vector<int>& prices) { int sz = prices.size(); if(sz <= 1) return 0原创 2021-03-12 20:06:07 · 213 阅读 · 0 评论 -
求1+2+…+n
1. 通过构造函数2. 通过逻辑短路3. 通过存储数据大小4. 通过析构函数原创 2021-03-11 21:56:26 · 208 阅读 · 0 评论 -
不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。因为不能使用加减乘除,则我们可以考虑使用位运算来达到对加减乘除做加法的操作。一个数保留非进位,一个数保留进位,当进位为0时,则可以进行返回了。同样也需要注意到,负数存在的情况。class Solution {public: int add(int a, int b) { while(b != 0) { // 负数时,不支持右移,则强转为uns原创 2021-03-10 22:37:34 · 100 阅读 · 0 评论 -
构建乘积数组
给定一个数组A[0,1,…,n−1]A[0,1,…,n-1]A[0,1,…,n−1],请构建一个数组 B[0,1,…,n−1]B[0,1,…,n-1]B[0,1,…,n−1],其中 B[i]B[i]B[i]的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i−1]×A[i+1]×…×A[n−1]B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]B[i]=A[0]×A[1]×…×A[i−1]×A[i+1]×…×A[n−1]。不能使用除法。原创 2021-03-09 19:40:21 · 111 阅读 · 0 评论 -
复杂链表的复制
题目描述:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof1.哈希表建立映射关系,当前节点和复制的节点。复制的节点为新开辟出来的节点开辟出来的节点next节点,为源节点的下一个节点的映射开辟出来的节点random节点,为源原创 2021-01-17 20:22:30 · 92 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/解题思路:某一值的路径,则二叉树最后节点必须为叶子节点采用dfs + 回溯代码:class Solution {public: vector<vector<原创 2021-01-17 16:16:58 · 100 阅读 · 1 评论 -
二叉搜索树的后序遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/解题思路:二叉搜索树的后序遍历序列。则最后的为根节点后序遍历时,左子树的值都比根节点值小当某节点比根节点值大时,则该节点为右子树,即右子树的值均大于根节点的值基于第三原创 2021-01-17 16:02:24 · 109 阅读 · 0 评论 -
从上到下打印二叉树
1.Ⅰ从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/采用二叉树的层序遍历:可采用递归和迭代的方式遍历1.1递归先保存根节点的值,再保存左右节点的值,并进行递归,当当前节点为空时,则直接返回。代码:class Solution {public: vector<int> ret;//返回的vecto原创 2021-01-16 16:32:58 · 177 阅读 · 1 评论 -
栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。链接:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof思路:判断一个序列是否为栈的弹出序列时,可考虑将元素入栈,再进行判原创 2021-01-16 15:52:51 · 83 阅读 · 0 评论 -
包含min函数的栈
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。该题主要是在调用min函数时,可以得到栈中的最小值。借用一个辅助栈辅助栈为空时,直接放入元素,辅助栈不为空时,若出栈的元素和辅助栈栈顶元素相等,则辅助栈和栈同时出栈入栈时,入栈元素与辅助栈栈顶相等时,则辅助栈需要将该元素入栈代码:class MinStack {public: /** initialize your data原创 2021-01-16 15:38:00 · 87 阅读 · 2 评论 -
对称的二叉树
题目描述:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/1.递归思路:递归的思路很容易想两节点不同时为空时,则不是对称的两节点同时为空,则是对称的两节点值不相等时,则不是对称的递归传递的条件,必须是一棵树的左边另一颗树的右边。和一颗树的右边和另一颗树的左边。这样的树的比较最后,才是对称的。代码:class原创 2021-01-08 11:12:38 · 105 阅读 · 0 评论 -
二叉树的镜像
题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像。示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]代码:class Solution {public: TreeNode* mirrorTree(TreeNode* root) { if(root == nullptr) return nullptr; TreeNode* left = mirrorTree(root-原创 2021-01-07 14:55:38 · 86 阅读 · 0 评论 -
合并两个排序的链表
题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof1.哨兵节点思路:先开辟一个临时节点,作为头节点,这样能避免头节点的更改。当两个链表不同时为空时,判断该头节点目前原创 2021-01-07 12:01:25 · 112 阅读 · 0 评论 -
反转链表
题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof1. 迭代思路:借用双指针首先,p指针指向头节点q指针指向p的next节点,此时,将p的next节点置为空当q指针直接不为空时原创 2021-01-07 11:39:44 · 127 阅读 · 0 评论 -
链表中倒数第k个节点
题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.1.快慢指针法思路:借用两个指针,快慢指针快指针先走k步当快指针不为空时,快慢指针同时向后走快指针为空时,返回慢指针图例:原创 2021-01-07 10:55:43 · 104 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof1. 一行代码代码:class Solution原创 2021-01-07 10:11:42 · 79 阅读 · 0 评论 -
删除链表的节点
题目描述:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof1. 双指针法借用两个指针,cur原创 2021-01-04 13:29:23 · 163 阅读 · 0 评论 -
打印从1到最大的n位数
题目描述:输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]链接:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/1. 无大数情况可采用快速幂 + 逐个遍历的方式。快速幂的求解可参考一下博主的上一篇文章:https://blog.csdn.原创 2021-01-04 12:51:56 · 116 阅读 · 0 评论 -
数值的整数次方
数值的整数次方原创 2021-01-03 14:45:36 · 129 阅读 · 0 评论 -
二进制中1的个数
二进制中1的个数原创 2021-01-03 13:56:30 · 138 阅读 · 0 评论 -
剪绳子
题目描述:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。链接:https://leetcode-cn.com/problems/jian-sheng-zi-lcof...原创 2021-01-02 16:14:58 · 263 阅读 · 2 评论 -
机器人的运动范围
题目描述:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?链接:https://leetcode-cn.com/problems/ji-qi-ren原创 2021-01-01 13:47:02 · 236 阅读 · 0 评论 -
矩阵中的路径
题目描述:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第原创 2020-12-31 15:13:30 · 169 阅读 · 0 评论 -
搜索旋转数组
1. 原题:题目描述:升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0输出:原创 2020-12-26 17:09:50 · 668 阅读 · 1 评论 -
旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:01.暴力查找思路:循环一遍,找最小值即可。代码:时间复杂度O(N)class Solution {public: int minArray(vect原创 2020-12-26 13:59:39 · 93 阅读 · 0 评论 -
青蛙跳台阶问题
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof1. dp思路:对于每一次跳的阶数,要么是1层,要么是2层,则到达第n层的次数为dp[n] = dp[n - 1] + dp[n - 2],和斐波那契数列一原创 2020-12-25 13:50:42 · 154 阅读 · 0 评论 -
斐波那契数列
题目描述:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:1示例 2:输入:n = 5输出:5链接原创 2020-12-24 13:29:12 · 348 阅读 · 0 评论 -
用两个栈实现队列、用队列实现栈
1.两个栈实现队列题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”][[],[3],[],[]]输出: [null,null,3,-1]示例 2:输入:[“CQueue”,“deleteHe原创 2020-12-23 13:48:04 · 118 阅读 · 1 评论 -
重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/1. 递归思路分析:前序遍历第一个为根节点,找到中序遍历的根节点,中序遍历左边为左子树,中序遍历右原创 2020-12-22 13:32:16 · 117 阅读 · 0 评论 -
从尾到头打印链表
题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入: head = [1,3,2]输出: [2,3,1]链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/1. 数组逆置法思路分析:将链表数据放到数组中,然后对数组进行逆置。代码:class Solution {public: vector<int> reversePrint(原创 2020-12-21 23:16:14 · 124 阅读 · 0 评论 -
替换空格
题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/示例 1:输入: s = “We are happy.”输出: “We%20are%20happy.”思路分析:从后往前遍历字符串,遇到空格时,插入02%,最后对返回的字符串进行反转。代码:class Solution {public: string replaceSpace(string s)原创 2020-12-19 11:45:59 · 110 阅读 · 1 评论 -
二维数组中的查找
题目描述:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof1.暴力查询思路分析:遍历整个二维数组,相等则返回true代码:class Solution {public: bool findNumberIn2原创 2020-12-18 16:38:35 · 112 阅读 · 1 评论 -
数组中重复的数字
题目描述:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof1. 利用临时数组思路分析:nums数组中n最大范围为10000,则开辟一个这样大的临时数组,对nums数组进行遍历,将其值对应的临时数组下原创 2020-12-17 21:06:37 · 107 阅读 · 0 评论 -
二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱原创 2020-12-12 22:52:53 · 96 阅读 · 0 评论 -
树的子结构
题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A:给定的树 B:返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof思路:找寻子结构,分为两种情况,该子结构在左边或者在右边。则进行递归判断找到了两值相等节点,开始检测是否是子结构不是,再继原创 2020-12-05 17:12:31 · 93 阅读 · 0 评论