C++
文章平均质量分 60
C++学习
焦妮敲代码
仅此一生,竭尽全力
展开
-
BM50 两数之和
BM50 两数之和1. 问题描述2. 样例说明3. 思路4. 代码5. 时间空间复杂度分析1. 问题描述2. 样例说明3. 思路不可行的简单方法:如果直接使用暴力解法,用两个for循环判断两个数的和是否等于target,必然会超时。正确的思路:使用哈希表,因为哈希表查找时间为O(1)。建立一个哈希表,键值对为<数组某个值,对应下标>从开始处遍历数组,对于第i个位置,在哈希表中寻找target-nums[i]是否存在,若存在,将两个下标放入数组中返回;若不存在,将其添加至表中原创 2022-04-04 21:14:11 · 640 阅读 · 0 评论 -
C++小知识——map和unordered_map区别
map和unordered_map1. map头文件和定义元素访问基本操作用途2. unordered_map头文件和定义基本操作使用示例3. 相同4. 不同头文件实现的数据结构存储空间查找性能的稳定性使用场景1. mapmap可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STl容器),map会以键从小到大的顺序自动排序。#include<iostram>#include<map>using namespace std;int main(){ ma原创 2022-04-04 20:35:44 · 3889 阅读 · 0 评论 -
二进制小数表示范围
对于二进制小数:只能精确表示诸如 x/2k的数其他的值只能近似表示例如:这些小数都不能被精确表示Value二进制1/30.0101010101[01]…1/50.001100110011[0011]…1/100.0001100110011[0011]…原创 2022-03-11 17:13:28 · 943 阅读 · 0 评论 -
Linux基本命令(基本每个指令都有图例)
Linux基本命令一. 基本操作1.1 文件文档相关操作1.2 参数指令1.3 进程相关指令。经常使用Linux,但是有些指令不常用,一想用又老是忘记,所以打算整理相关笔记,仅供参考。一. 基本操作1.1 文件文档相关操作查询当前所在目录:pwd进入当前目录的子目录:cd在屏幕上输出字符: echo建立一个空文本文件:touch显示文件内容:cat(可以使用more来显示比较大的文本文件内容)复制文件: cp若f2.txt文档本来不存在,则会自动创建原创 2021-10-26 22:57:34 · 241 阅读 · 0 评论 -
JZ33 二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列1. 问题描述2. 样例说明3.解法一:分治算法思想代码时间空间复杂度分析4. 解法二:栈算法思想代码时间空间复杂度分析1. 问题描述2. 样例说明3.解法一:分治算法思想二叉树的后序遍历顺序是:左子树 -> 右子树 -> 根节点,因此序列的最后一个数代表了根节点因此我们可以将一个序列划分为3段, 左子树+右子树+根, 例如[4, 8, 6, 12, 16, 14, 10]可以根据根节点的值将其划分为左子树[4, 8, 6], 右子树[12, 16,原创 2021-11-29 14:58:06 · 323 阅读 · 0 评论 -
JZ37 序列化二叉树
序列化二叉树1. 问题描述2. 样例说明3. 解法一:先序遍历算法思想代码时间空间复杂度分析4. 解法二:层次遍历算法思想代码时间空间复杂度分析1. 问题描述2. 样例说明3. 解法一:先序遍历算法思想使用先序遍历的方式序列化二叉树,用#表示空,!标志一个结点值的结束。当遇到非空节点时取出其值的字符串表示,再在后面加个!标示着结尾,以便我们反序列化时确定节点的值。先用string存储得到的字符序列,再转换为题目要求的char*字符串;在反序列化时使用引用的下标实时指向当前待处理的位置。原创 2021-12-08 10:11:51 · 488 阅读 · 0 评论 -
关于刷题路上的小知识点
刷题小知识点1.C++中的 to_string()系列函数将数值转换成字符串形式。注意,不支持C++ 11标准的编译器可能不支持to_string()。string to_string(int val);string to_string(long val);string to_string(long long val);string to_string(unsigned val);string to_string(unsigned long val);string to_string(unsi原创 2021-12-08 09:13:14 · 421 阅读 · 0 评论 -
JZ28 对称的二叉树
对称的二叉树1. 问题2. 算法思想3. 代码4. 时间空间复杂度分析1. 问题2. 算法思想1.若满足对称二叉树,必须满足:1. L->val == R->val2. L->left->val == R->right->val3. L->right->val == R->left->val则其思想为:设置一个递归函数isSame(r1, r2),表示如果对称,返回true,否则返回false递归终止条件:r1nullp原创 2021-12-05 10:11:20 · 467 阅读 · 0 评论 -
JZ79 判断是不是平衡二叉树
判断是不是平衡二叉树1. 问题描述2. 算法思想3. 代码4. 时间复杂度分析1. 问题描述2. 算法思想用后序遍历的方法遍历二叉树求,先递归到叶子结点,然后在回溯的过程中来判断是否满足条件。如果不满足平衡二叉树的定义,则返回-1,并且如果左子树不满足条件了,直接返回-1,右子树也是如此,相当于剪枝,加速结束递归。3. 代码class Solution {public: int depth(TreeNode *root) { if (!root) return 0;原创 2021-12-03 10:39:59 · 297 阅读 · 0 评论 -
JZ34 二叉树中和为某一值的路径(二)
二叉树中和为某一值的路径1. 问题描述2. 样例说明3. 算法思想4. 代码5. 时间复杂度分析1. 问题描述2. 样例说明3. 算法思想要想找出所有路径,就必须遍历整棵树,假设先序遍历,伪代码如下:void preOrder(TreeNode *root) { // process root if (root->left) preOrder(root->left); if (root->right) preOrder(root->rig原创 2021-11-30 10:05:43 · 384 阅读 · 0 评论 -
JZ86 在二叉树中找到两个节点的最近公共祖先
在二叉树中找到两个节点的最近公共祖先1. 问题描述2. 样例说明3. 解法一:递归算法思想代码时间空间复杂度分析4. 解法二:非递归算法思想代码时间空间复杂度分析1. 问题描述2. 样例说明3. 解法一:递归算法思想分析可知,对于节点 o1, o2 的最近公共祖先,只存在三种情况:代码/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */原创 2021-12-11 10:49:16 · 440 阅读 · 0 评论 -
JZ8 二叉树的下一个结点
二叉树的下一个结点1. 问题描述解法一:简单算法思想伪代码时间空间复杂度分析解法二:巧妙算法思想代码时间空间复杂度分析1. 问题描述给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。注意:该题的输入只有一个结点。该结点不是指向根节点,而是指向给定的那个结点。解法一:简单算法思想根据给出的结点求出整棵树的根节点根据根节点递归求出树的中序遍历,存入vector在vector中查找当前结点,则当前结点的原创 2021-12-03 11:52:09 · 418 阅读 · 0 评论 -
JZ84 二叉树中和为某一值的路径(三)
二叉树中和为某一值的路径1. 问题描述2. 样例说明3. 解法一:两次DFS算法思想代码时间空间复杂度分析1. 问题描述2. 样例说明3. 解法一:两次DFS算法思想使用两次dfs解决第一次dfs遍历二叉树每个结点。第二次dfs以每个结点为根进行遍历,寻找等于目标值的路径个数。代码/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(原创 2021-12-10 09:22:42 · 203 阅读 · 0 评论 -
JZ26 树的子结构
树的子结构1. 问题描述2. 算法思想3. 代码4. 时间空间复杂度分析1. 问题描述2. 算法思想先判断两个树是否为空,题目中强调空树不是任意一个树的子结构。所以如果有任意一颗为空,则返回0。另外写一个函数Ispart用于判断p2是否为p1的真子树。如果已经Ispart已经为真,则表明是B是A的子结构。否则递归判断A的左子树和A的右子树是否存在步骤2为真的情况。3. 代码/*struct TreeNode { int val; struct TreeNode *left; s原创 2021-11-28 16:58:25 · 453 阅读 · 0 评论 -
JZ9 用两个栈实现队列
用两个栈实现队列1. 问题描述2. 算法思想3. 代码4. 时间空间复杂度分析1. 问题描述示例:2. 算法思想push操作就直接往stack1中push。pop操作需要分类一下:如果stack2为空,那么需要将stack1中的数据转移到stack2中,然后在对stack2进行pop如果stack2不为空,直接pop就ok。3. 代码class Solution{public: void push(int node) { stack1.push(原创 2021-12-17 09:21:37 · 252 阅读 · 0 评论 -
JZ35 复杂链表的复制
这里写目录标题1. 问题描述2. 样例说明3. 解法一:哈希表3.1 算法思想3.2 代码3.3 时间空间复杂度分析4. 解法二:链表拼接、拆分4.1 算法思想4.2 代码4.3 时间空间复杂度分析1. 问题描述2. 样例说明3. 解法一:哈希表3.1 算法思想(1)我们先不考虑结点的random指针,先通过next指针把链表连接起来。创建一个表头结点,然后遍历题目给定的链表,创建新结点,不断与上一结点连接,产生一个新的链表。(2) 在第(1)步的过程中,通过哈希表建立映射关系,采用的是原创 2021-11-25 10:30:44 · 641 阅读 · 0 评论 -
JZ36 二叉搜索树与双向链表
1. 问题描述2. 解法一:递归算法思想(1)使用一个指针preNode指向当前结点root的前继。(例如root为指向10的时候,preNode指向8)(2)对于当前结点root,有root->left要指向前继preNode(中序遍历时,对于当前结点root,其左孩子已经遍历完成了,此时root->left可以被修改。);同时,preNode->right要指向当前结点(当前结点是preNode的后继),此时对于preNode结点,它已经完全加入双向链表。代码/*s原创 2021-12-11 11:35:28 · 219 阅读 · 0 评论 -
常见的STL容器--集合set
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar原创 2021-09-24 17:20:08 · 181 阅读 · 1 评论 -
二叉树的遍历——前序、中序,后序,层次遍历以及相关题解
二叉树的遍历结点类型1. 前序遍历(preorder traversal)2. 中序遍历(inorder traversal)3. 后序遍历(postorder traversal)4. 三者区别5. 根据前序遍历中序遍历重构二叉树4.1 解法一算法思想代码时间复杂度分析4.2 解法二代码结点类型struct TreeNode { int val; TreeNode *left; //左子 TreeNode *right; //右孩子 TreeNode(int x) : val(x), le原创 2021-11-28 11:38:33 · 2879 阅读 · 0 评论 -
求二叉树的深度
求二叉树的深度1. 问题描述2.解法一:分治法(递归)2.1 算法思想2.2 代码2.3 时间复杂度分析3.解法二:层次遍历3.1 算法思想3.2 代码3.3 时间空间复杂度分析1. 问题描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。2.解法一:分治法(递归)2.1 算法思想分治法:求一个规模为n的问题,先求左边规模大约为n/2的问题,再求右边规模大约为n/2的问题,然后合并左边,右边的解,原创 2021-11-27 10:58:35 · 1617 阅读 · 0 评论 -
合并两个排序的链表(两种解法)
问题描述样例说明算法思想初始化:定义cur指向新链表的头结点操作:(1)如果L1指向的结点值小于等于L2指向的结点值,则将L1指向的结点值链接到cur的next指针,然后L1指向下一个结点值。否则,让L2指向下一个结点值(2)循环步骤1,直到L1或者L2为nullptr(3)将L1或者L2剩下的部分链接到cur的后面代码/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x)原创 2021-11-24 15:33:06 · 864 阅读 · 0 评论 -
快慢指针的常见用法
快慢指针一.定义二.应用2.1找中点一.定义快慢指针指的是两个步调不一样的指针,快指针一次遍历两个节点,慢指针一次遍历一个节点。二.应用2.1找中点1.当快指针遍历到空节点时,慢指针指向的位置为链表的中间位置。ListNode * Find_Midnode(ListNode *head){ListNode *fast=head;ListNode *slow=head;while(fast&&fast->next){ fast=fast->next-&原创 2021-11-02 18:26:33 · 2753 阅读 · 0 评论 -
《算法笔记》——链表
链表一.链表的概念二. 使用malloc 函数或者new 运算符为链表结点分配内存空间2.1 malloc2.2 new运算符2.3 内存泄漏三.链表的基本操作3.1 创建链表3.2 查找元素一.链表的概念1.链表由若干个结点组成(每个结点代表一个元素),且结点在内存中的存储位置通常是不连续的。2.链表的两个结点之间一般通过一个指针来从一个结点指向另一个结点,因此链表的结点一般由两部分构成,即数据域和指针域。数据域存放结点要存储的数据,指针域指向下一个结点的地址。这样就会产生从某个结点开始的,由指针连原创 2021-10-30 21:31:10 · 212 阅读 · 0 评论 -
指针详细说明以及用法
指针1. 指针的定义2. *p和p的内容区别3.`(*p+1)`和`*p+1` 的区别4. 空指针nullptr1. 指针的定义指针变量所存的内容就是内存的地址编号。2. *p和p的内容区别我们可以使用一个简单的cpp来进行说明,指针int *p=& i就是将i的地址赋值给p,我们输出p,得到的是i的虚拟地址。输出*p才可以得到地址里的内容,即i的内容10。3.(*p+1)和*p+1 的区别(*p+1) //指的数组里的第二个元素*p+1 //指的数组的第一个元素+1例子原创 2021-10-30 15:42:26 · 228 阅读 · 0 评论