
题目解析
leetcode 剑指offer等
疯狂嘚程序猿
这个作者很懒,什么都没留下…
展开
-
剑指offer---二进制中1的个数
一、问题描述题目:统计二进制中1的个数。 写一个函数返回参数二进制中 1 的个数。示例:150000 11114 个 1 -1 ................ 32个1示例分析:二进制负数,在内存中以其补码的方式进行存储。-1的原码:10000000 00000000 00000000 00000001(第一位为符号位)-1的反码:11111111 11111111 11111111 11111110-...原创 2020-09-13 21:01:43 · 736 阅读 · 0 评论 -
最全的《剑指offer》题目解析---C++
面试题题目1:定义一个空的类型,里面没有任何的成员变量和成员函数,对该类型求sizeof,结果是多少?答案:1追问:为什么不是0?答案:空类型的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定。Visual Studio中每个空类型的实例占用1字节的空间。追问:如果在该类型中添加一个构造函数和析构函数,再对该类型求sizeof,得到的结果又是多少?答案:和前面一样,还原创 2021-02-01 22:48:30 · 809 阅读 · 0 评论 -
二叉树相关问题
二叉树的最近公共祖先节点class Solution {public: //前序遍历二叉树 bool prevOrder(TreeNode* root,TreeNode* x,stack<TreeNode*>& path) { if(root == nullptr) return false; //根节点入栈 path.push(root); if(root == x)原创 2021-05-22 22:02:43 · 177 阅读 · 0 评论 -
二叉树的还原(前序和中序、中序和后序)
根据前序和中序序列还原二叉树class Solution {public: TreeNode* _buildTree(vector<int>& preorder,vector<int>& inorder,int& prevIndex,int inBegin,int inEnd) { if(prevIndex >= preorder.size()) return nullptr;原创 2021-05-22 20:09:34 · 447 阅读 · 0 评论 -
二叉树的递归和非递归遍历(前序、中序、后序、层序)
二叉树的前序遍历递归class Solution {public: void _preorderTraversal(vector<int>& v,TreeNode* root) { //递归实现 if(root == nullptr) return; v.push_back(root->val); _preorderTraversal(v,root->left)原创 2021-05-19 17:53:05 · 172 阅读 · 0 评论 -
leetcode---数组中只出现一次的数字I & II & III
数组中只出现一次的数字I问题描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1: 输入: [2,2,1] 输出: 1示例2: 输入: [4,1,2,1,2] 输出: 4来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/single-number解题思路异或运算:相同为0,不...原创 2021-04-01 17:01:54 · 1513 阅读 · 0 评论 -
leetcode---栈类问题总结
1.每日温度leetcode链接:https://leetcode-cn.com/problems/daily-temperatures/请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0 来代替。例如,给定一个列表temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是[1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度...原创 2021-03-24 20:12:38 · 535 阅读 · 0 评论 -
剑指offer---从上往下打印二叉树
题目23:从上王新爱打印二叉树(leetcode链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/)题目分析方法1:建立队列,利用队列的先进先出特点,将二叉树的节点入队,当每一个父节点出队时将其左右孩子节点入队,这样队列中的节点顺序就是按照从上向下从左向右的顺序打印的。方法2:题目改进,使用二维数组返回结果,二叉树的每一层保存在二维数组的一项中(leetcode原创 2021-03-13 11:40:08 · 389 阅读 · 3 评论 -
C++---模板
目录一、泛型编程二、函数模板三、类模板一、泛型编程泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。 例如,实现一个函数可以对所有内置类型进行交换,在学习泛型编程前我们可以使用函数重载完成这个需求,如下:void Swap(int& left, int& right) { int temp = left; left = right; right = temp; }void Swap(double&原创 2021-03-12 22:28:42 · 421 阅读 · 0 评论 -
剑指offer---栈的压入弹出序列
题目22:栈的压入弹出序列(leetcode链接:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/)题目分析代码描述class Solution {public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { if(pushed.size(原创 2021-03-12 15:50:33 · 369 阅读 · 0 评论 -
剑指offer---最小的K个数(堆和partition算法两种思路解决)
题目30:最小的K个数(leetcode链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/)题目分析方法1:对数组进行排序,在选出前K个即可(采用堆排序时间复杂度为NlogN,快排的时间复杂度为NlogN)方法2(特别适合n特别大的时候)建一个含有K个节点的堆,由于要找的是最小的K个数,因此应该建大堆(大堆的特点就是根节点的元素是堆中的最大节点),遍历数组如果有比根节点小的元素就将其替换掉并对堆重新进行调整。时间原创 2021-03-10 16:31:15 · 385 阅读 · 0 评论 -
剑指offer---数组中出现次数超过一半的数字
题目39:数组中出现次数超过一般的数字(leetcode链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/)题目分析方法1:对数组进行排序,位于数组中间的一个数必然是出现次数超过数组长度一般的数。方法2:数组中出现次数超过数组长度的数的出现次数比其他所有数字出现次数的和还要多,因此我们可以遍历数组同时保存两个值,数组中的一个元素和出现次数。当遍历到下一原创 2021-03-09 15:03:54 · 297 阅读 · 0 评论 -
leetcode---子集问题(回溯算法)
一、问题描述给你一个整数数组nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0] 输出:[[],[0]]提示:1 <= nums.length <= 10 ; -10 <= nums[i] <= 10 ; n...原创 2021-03-08 20:13:13 · 1189 阅读 · 0 评论 -
剑指offer---顺时针打印矩阵
题目20:顺时针打印矩阵(leetcode链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/)题目分析代码描述原创 2021-03-07 21:25:10 · 367 阅读 · 0 评论 -
剑指offer---二叉树的镜像
题目19:二叉树的镜像(leetcode链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/)题目分析代码描述class Solution {public: TreeNode* mirrorTree(TreeNode* root) { if(root == NULL || (root->left == NULL && root->right == NUL原创 2021-03-06 21:22:48 · 319 阅读 · 0 评论 -
剑指offer---树的子结构
题目18:树的子结构(leetcode链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/)题目分析在探讨这道题目之前,我们先来看一个类似的比较简单的题目:另一个树的子树(链接:https://leetcode-cn.com/problems/subtree-of-another-tree/)判断另一个数的子树这道题目要求树的子树要包含其所有子孙节点,因此我们可以遍历二叉树找到一个节点与所给子树中的根节点相等的节点,在判断原创 2021-03-06 11:34:01 · 371 阅读 · 0 评论 -
leetcode---阶乘尾数
一、问题描述设计一个算法,算出 n 阶乘有多少个尾随零。示例 1: 输入: 3 输出: 0 解释:3! = 6, 尾数中没有零。示例2: 输入: 5 输出: 1 解释:5! = 120, 尾数中有 1 个零.说明: 你算法的时间复杂度应为O(logn)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/factorial-zeros-lcci二、题目分析题目要求时间复杂度为O(log n),因此不...原创 2021-03-05 22:28:10 · 650 阅读 · 0 评论 -
剑指offer---合并两个排序的链表
题目17:合并两个排序的链表(leetcode链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/)题目分析方法1方法2比较两个链表的头结点,较小的一个节点就是新链表的头结点。剩下的节点和另一个链表还可以以同样的方式进行判断找出较小的一个节点,这就是一个递归的过程。代码描述方法1class Solution {public: ListNode* merg原创 2021-03-04 18:16:24 · 348 阅读 · 1 评论 -
剑指offer---反转链表
题目16:反转链表(leetcode链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/)题目分析代码描述class Solution {public: ListNode* reverseList(ListNode* head) { //判断链表是否为空或者只有一个节点 if(head == NULL || head->next == NULL)原创 2021-03-04 16:46:17 · 339 阅读 · 1 评论 -
leetcode--- 使结果不超过阈值的最小除数
一、问题描述给你一个整数数组nums 和一个正整数threshold ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。请你找出能够使上述结果小于等于阈值threshold的除数中最小的那个。每个数除以除数后都向上取整,比方说 7/3 = 3 , 10/2 = 5 。【题目保证一定有解】示例 1:输入:nums = [1,2,5,9], threshold = 6 输出:5 解释:如果除数为 1 ,我们可以得到和为 17 (1+2+5+9)。如果除数为 4 ...原创 2021-03-04 15:56:58 · 550 阅读 · 3 评论 -
剑指offer---链表中倒数第K个节点
题目15:链表中倒数第K个节点(leetcode链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/)题目分析方法1:统计链表中节点个数,计算出倒数第K个节点是正数第几个节点,遍历链表找到这个节点。方法2:维护两个指针prev和curr,curr指向第链表的第K个节点,prev指向链表的头结点。同时移动两个指针,当curr指针指向链表的尾节点时,指针prev指向的就是链表的倒数第K个原创 2021-03-03 15:15:12 · 367 阅读 · 1 评论 -
剑指offer---调整数组使奇数位于偶数前面
题目14:调整数组使奇数位于偶数前面(leetcode链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/)题目分析方法1:完成基本功能的解法维护两个指针,一个指向数组的开始位置另一个指向数组的结束位置,移动两个指针,如果前边指针指向的是偶数后边指针指向的是奇数,交换两个指针的值。方法2:升级版上面两种改进方法是没有任何问题的原创 2021-03-01 17:23:14 · 364 阅读 · 0 评论 -
剑指offer---在O(1)时间删除链表节点
题目13:在O(1)时间删除链表节点(leetcode链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/)题目分析方法1:时间复杂度O(N)顺序遍历链表,找到要删除的链表节点以及前驱节点,让前驱节点的next指向要删除节点的next节点。方法2:时间复杂度O(1)将要删除的节点的next节点复制覆盖它的前驱节点(要删除的节点),在删除该节点。代码描述方法1//leetcod原创 2021-02-28 15:21:05 · 461 阅读 · 0 评论 -
剑指offer---打印1到最大的n位数
面试题12:打印1到最大的n位数(leetcode链接:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/)问题分析方法1:最容易想到的,leetcode可以提交通过的,不考虑大数的方法根据n计算出最大的n位数,利用循环打印。但是,这个方法如果我们定义maxNum为int类型一旦超出int就会溢出,long long同理。方法2:在字符串上模拟数字加法的解法,解决大数溢出问题将初始字符串原创 2021-02-26 14:55:07 · 397 阅读 · 0 评论 -
剑指offer---数值的整数次方(重点)
题目11:数值的整数次方(leetcode链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/)题目分析方法1利用for循环,expnent为多少就对base进行多少次迭代乘法运算。但是需要考虑下面特殊情况:1)当expnent为负数,对expnent求绝对值,进行运算再将运算结果求倒数即可。2)base 和 expnent都为0.0,0的0次方是没有意义的,可以返回0或13)当expnent原创 2021-02-24 20:20:57 · 423 阅读 · 0 评论 -
剑指offer---斐波那契数列 & 青蛙跳台阶
题目9:斐波那契数列(leetcode链接:https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof/)问题分析方法1:递归我们以f(10)为例,要求f(10)需要先求出f(9)和f(8),求f(9)要求出f(8)和f(7)......,可以用递归树表示,如下图:但是,使用递归存在一个很严重的效率问题。从上面的递归树中,可以看出使用递归解法存在很多的重复计算,这颗树中有很多的节点是重复的,而且随着n的增大重复节点会急剧增加,原创 2021-02-24 14:29:02 · 433 阅读 · 0 评论 -
剑指offer---重建二叉树
题目分析在二叉树中,前序序列的第一个节点是根节点,而在中序序列中根节点一般在序列中间位置。中序序列中,根节点值的左侧的m个值是根节点的左子树根节点右侧的n个值值是根节点的右子树,而在前序序列中根节点后面紧跟着的m个值是左子树,其余的n个值是右子树。因此,可以通过递归利用左右子树的前序和中序序列构建左右子树,从而构建二叉树。例如,下面的二叉树中,前序序列的第一个值就是1。根据中序序列的特点,可以确定中序序列中根节点的左侧有三个值右侧有四个值(左侧的三个值是左子树的值,右侧的四个值是右子树的值)。..原创 2021-02-23 19:55:07 · 470 阅读 · 0 评论 -
剑指offer---从尾到头打印链表
题目5:从尾到头打印链表(leetcode链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/)题目分析思路1:如果题目没有要求要保持原有链表结构,我们可以考虑将链表反转,在进行打印。思路2:从尾到头打印链表,越靠近头的节点越晚打印,我们可以利用栈的先进后出特点,遍历链表将链表的节点全部入栈在顺序出栈打印即可。思路3:递归。从尾到头打印链表,我们可以认为是先将链表的后n-1个节点逆序打印,在原创 2021-02-23 12:46:57 · 469 阅读 · 0 评论 -
leetcode---逆波兰表达式求值
一、问题描述根据 逆波兰表示法,求表达式的值。有效的运算符包括+,-,*,/。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分;给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例1:输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例2:输入: ["4", "13", "5", "/", "+"]...原创 2021-02-19 19:20:32 · 696 阅读 · 0 评论 -
剑指offer---旋转数组的最小的数字
题目8:旋转数组的最小数字(leetcode链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/)问题分析代码描述原创 2021-02-07 19:32:19 · 618 阅读 · 0 评论 -
剑指offer---第一个只出现一次的字符
题目35:第一个只出现一次的字符(leetcode连接:https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/)问题分析 看到这道题时,我们最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路的时间复杂度是O...原创 2021-02-03 22:19:05 · 702 阅读 · 0 评论 -
剑指offer---替换空格
题目2:替换空格(leetcodek连接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/)题目分析如果题目要求不能在原字符串上进行修改(原字符串为常量不能进行修改、原字符串没有足够的空间),我们可以统计出字符串的长度和字符串中空格的数量,每替换一个空格,需要额外2个字节的空间,通过此规律我们可以开辟出一个足够大的空间,并赋值即可(这种方法比较简单不做详细解释)。如果题目要求必须在原字符串上进行修改且时间复杂度为O(n)。我们先来看原创 2021-02-03 22:13:34 · 668 阅读 · 1 评论 -
剑指offer---二维数组中的查找
题目1:二维数组中的查找(leetcode链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/)题目解析题目分析已知条件:二维数组每一行从左到右递增,每一列从上到下递增。如果暴力遍历而数组,时间复杂度为O(m*n),而我们所直到的二分查找时间复杂度为O(logn);而二分法的思想是每次缩小目标值所在的范围,条件是目标数组有序;本题中目标数组是一个二维数组,虽然每行每列都是有序的,但是整体无序,故不能原创 2021-02-03 22:09:54 · 685 阅读 · 0 评论 -
leetcode---单值二叉树(递归遍历二叉树)
1.问题描述如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回true;否则返回false。二、问题分析 递归遍历二叉树,如果二叉树的左右子树均为NULL则返回true;如果二叉树的左右子树中有一个是NULL同时非空的子树的值和其父节点的值相等,则递归判断非空子树的左右子树是否为NULL,否则返回false;如果二叉树的左右子树都不为NULL,则判断左右子树的值和其父节点的值是否都相等,如果都相等则递归判断左右子树的子树是否为NU...原创 2021-01-13 20:58:10 · 770 阅读 · 1 评论 -
leetcode---数组中重复的数字(非常牛逼的置换算法)、原地置换算法排序
一、原地置换算法排序 原地置换算法使用场景:在一个具有n个元素大小的数组中,所有元素排序在0~n-1范围内并且所有元素不重复,对数组中的元素进行排序。 算法描述:遍历数组,如果遇到第i个位置上的元素不是i,而是m,则将m位置上的元素和i位置上的元素进行交换,直到i位置上的元素为i时停止交换,继续下一轮迭代。 时间复杂度:最坏的情况就是第一次for循环就已经排序好了,但是循环还需继续走n-1次,最好的情况是...原创 2021-01-11 23:43:47 · 1387 阅读 · 0 评论 -
LeetCode---交换链表中的节点
一、问题描述给你链表的头节点 head 和一个整数 k 。交换链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。示例 1:输入:head = [1,2,3,4,5], k = 2 输出:[1,4,3,2,5]示例 2:输入:head = [7,9,6,6,7,8,3,0,9,5], k = 5 输出:[7,9,6,6,8,7,3,0,9,5]示例 3:输入:head = [1], k = 1 输出:[1]示例 4:输入:head = ...原创 2021-01-11 19:34:20 · 1141 阅读 · 0 评论 -
leetcode---用队列实现栈
一、问题描述使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是push to back, peek/pop from front, size, 和is empty这些操作是合法的。你所使用的语言也许不支持队列。你可以使用 list 或者 deque(双端队列)来模拟一个队列, ...原创 2021-01-08 22:54:02 · 881 阅读 · 0 评论 -
leetcode---用两个栈实现队列
一、问题描述用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"] [[],[3],[],[]];输出:[null,null,3,-1]示例 2:输入:["CQueue","deleteHead","app...原创 2021-01-08 18:02:28 · 898 阅读 · 0 评论 -
剑指offer---复制带随机值的链表
问题描述给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝。我们用一个由n个节点组成的链表来表示输入/输出中的链表。每个节点用一个[val, random_index]表示:val:一个表示Node.val的整数。random_index:随机指针指向的节点索引(范围从0到n-1);如果不指向任何节点,则为null。示例 1:输入:head = [[7,null],[13,0],[11,4],[10,2],[...原创 2020-12-27 23:36:16 · 672 阅读 · 0 评论 -
leetcode---环形链表II
问题描述给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表,使用 O(1) 空间解决此题。示例 1:【输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点】 解释:链表中有一个环,其尾部连接到第二个...原创 2020-12-25 22:44:03 · 617 阅读 · 0 评论