三公子Tjq
码龄6年
  • 3,359,209
    被访问
  • 359
    原创
  • 5,287
    排名
  • 1,010
    粉丝
关注
提问 私信

个人简介:三少爷的剑:剑气纵横三万里,一剑光寒十九洲!

  • 目前就职: 百度
  • 加入CSDN时间: 2016-04-08
博客简介:

净无邪博客

博客描述:
三少爷的剑:剑气纵横三万里,一剑光寒十九洲!
查看详细资料
  • 8
    领奖
    总分 5,783 当月 153
个人成就
  • 博客专家认证
  • 获得1,406次点赞
  • 内容获得485次评论
  • 获得6,256次收藏
创作历程
  • 11篇
    2022年
  • 33篇
    2021年
  • 33篇
    2020年
  • 88篇
    2019年
  • 137篇
    2018年
  • 72篇
    2017年
成就勋章
TA的专栏
  • C++刷题
    24篇
  • 设计模式
    24篇
  • STL 源码剖析
    3篇
  • C++对象模型
    3篇
  • 数据结构与算法
    34篇
  • Linux积累
    20篇
  • Qt基础知识
    141篇
  • Qt工程应用
    84篇
  • C++应用积累
    48篇
  • C++/MFC多线程编程
    6篇
  • MFC积累
    32篇
  • 嵌入式积累
    94篇
  • Socket编程
    2篇
  • 数据库积累
    8篇
  • bat批处理文件
    4篇
  • MQTT协议工程应用
    5篇
  • opencv基础知识
    18篇
  • opencv工程应用
    3篇
  • 其余积累
    5篇
  • 文件系统
    1篇
兴趣领域 设置
  • 数据结构与算法
    数据结构
  • 服务器
    linux
  • 最近
  • 文章
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

设计一个LRU(最近最少使用缓存)结构——C++

本体主要是设计一个LRU结构,LRU主要用在缓存策略上保证最近最少使用的数据页换出,从而提高CPU查找缓存的命中率。题目主要是设计一个结构类型struct Lru{};该类型包含两个成员方法get(int)和set(int,int),且要求这两个方法的时间复杂度为O(1)。查找时间复杂度为O(1)我们一般想到查表,比如std::unordered_map和std::unordered_set,但是题目还要求插入和删除数据也是O(1),这时一般的map和set和vector都不能满足要求,只有链表可以符合要求
原创
发布博客 2022.02.26 ·
153 阅读 ·
0 点赞 ·
0 评论

求最长不含重复字符的子字符串——C++

拿到题目第一想法是滑动窗口,用左left右right指针只差表示不重复子字符串长度,然后右指针依次右移动,假如入到重复字符,则更新左指针到不重复的字符串位置。比如abba,此时ab为不重复,当右指针移到abb时有重复字符,此时需要更新左指针到不重复的字符位置,也即abb的最后一个b的位置,此时左右指针指向同一个值。如何更新左指针到最近重复字符位置呢,此时需要用一个哈希表记录每个字符和对应字符的下标,并且遇到重复字符则更新为最近位置。关键代码如下:
原创
发布博客 2022.02.22 ·
154 阅读 ·
2 点赞 ·
0 评论

求回文链表——C++

2.1题目分析该题有三种常见解法,分别是递归、拷贝到数组再判断回文、反转后半部分链表。下面是采用后面两种方法解题。2.2反转后半部分链表由于回文是前后对称,故只需要反转链表后半部分内容,再与前面进行比较即可。找到链表后半部分源码如下:
原创
发布博客 2022.02.19 ·
61 阅读 ·
0 点赞 ·
0 评论

一个简单计算器(不含括号和负数)实现——C++

根据题意要求,分析出需要给字符串去空格,以及采用栈方式将加减符号先压入栈,然后把乘除符号后面压入,并且最多压入两个元符号(+ *)就要清空符号栈。思路:1. 先去空格2. 符号栈,数字栈3. 提取字符+、-、*、/,提取数字val=val*10+str[i]-'0'4. 先运算*、/,结果压入栈,再把压入栈的+、-弹出运算5. 先遍历字符串数组,然后区分是加减号和乘除号。如果是加减号,则判空。如果为空则直接压入符号栈;非空则循环计算和消耗符号栈,知道符号栈为空为止。如果是乘除号,则判断。如果为
原创
发布博客 2022.02.08 ·
70 阅读 ·
1 点赞 ·
0 评论

求最长回文子串——C++ (动态规划+暴力解法)

看到该题第一想法是暴力解法,即最长子串的长度从最长到最短开始遍历,假如前面出现回文则直接返回,代码可以参考最后面代码,不过该解法时间复杂度为O(^3)超过时间限制,故考虑动态规划。本题也是采用动态规划才通过啊,下面是具体分析1. 状态方程: f(i, j) = true 表示回文2. 状态转移方程: f(i, j) = f(i + 1, j - 1); i > 2, 考虑i = 0,i = 1边界3. 边界条件: f(i, i) = true; (i < n) f(i, i + 1) =
原创
发布博客 2022.02.07 ·
825 阅读 ·
1 点赞 ·
0 评论

求有向图起点0到终点n-1所有可能路径(深搜dfs)——C++

​二、题目分析2.1思路分析该题主要求有向图起点到终点的所有可能路径。我们以前学过图的遍历分为深度优先搜索(DFS)和广度优先搜索(BFS),该题可以采用图的深度优先搜索(DFS)进行解题。进行DFS时从起点开始搜索,直到遇到终点n-1结束当前轮次搜索,此时说明已经找到一条连通路径。当从起点到终点的DFS所有可能经过节点全部遍历完一次后,所有可能的路径结果也就出来了。2.2代码实现分析知道思路,那么我们开始代码实现分析。首先需要封装一个dfs()函数,该函数输入四个参数分别为图数组gra
原创
发布博客 2022.01.22 ·
140 阅读 ·
1 点赞 ·
0 评论

查找有序数组(二分法)(时间复杂度O(logn))——C++

查找有序数组指定元素,返回目标元素下标,如果不存在,则插入适当位置使数组仍然保持有序,时间复杂度为O(log(n)),该算法是基本查找算法,可以用二分法。下面是代码实现。class Solution {public: int searchInsert(vector<int>& nums, int target) { int size = nums.size(), left = 0, right = size - 1, mid = 0; while (l
原创
发布博客 2022.01.22 ·
470 阅读 ·
1 点赞 ·
0 评论

图的并查集QuickFind类总结——C++

图分为无向图、有向图、加权图。其中理解图论中一个重要概念是并查集。并查集有两个重要功能,分别是find查找根节点函数和union连通两个节点。传统的并查集实现算法效率较低,引申出两种优化版的并查集算法,分别是QuickFind类和UnionFind,本文主要介绍QuickFind类的实现。一、类QuickFind介绍1.1 类QuickFind功能和函数类QuickFind主要有两个重要函数,分别是findRoot()和unionNode()。函数findRoot()功能是查找某个节点的根节
原创
发布博客 2022.01.22 ·
604 阅读 ·
1 点赞 ·
0 评论

求俄罗斯套娃信封问题——C++

​如果前面掌握了最长上升子序列长度——C++题目,那么这题俄罗斯套娃信封问题将是非常简单,区别只在于在状态转移方程比较判断是将一维数组判断换成二维数组判断即可。
原创
发布博客 2022.01.14 ·
126 阅读 ·
1 点赞 ·
0 评论

求最长递增子序列个数——C++

​由于上一篇博客已经分析过求最长上升子序列长度——C++的经典LIS问题,该题是求最长增长子序列个数,经过分析,这题也只是经典LIS(Longest Increasing Subsequence)问题的变种,也就是用同样的LIS框架,区别在于本体需要额外记录每个最长子序列个数。下面是具体实现思路。用dp[i]记录最长子序列长度maxLen,count[i]记录最长子序列个数,其中i表示数组的元素个数,0 <= i < n;如果求出前dp[i]和count[i]的i-1元素的值,则可以推导出:1.2代码实现
原创
发布博客 2022.01.13 ·
102 阅读 ·
1 点赞 ·
0 评论

求最长上升子序列长度——C++

拿道题目,第一思路是先分析。求数组最长上升子序列,也就是意味着要遍历整个数组中所有子序列,这时可以考虑是否可以用动态规划。由于动态规划知识,知道这是一题线性动态规划的题目,可以采用线性动态规划解法,即使经典的LIS(Longest Increasing Subsequence)。动态规划满足三个条件:状态方程、状态转移方程、边界条件,根据分析可知该题满足条件,下面是分析的动态转移方程:1.2代码实现分析由上面的状态转移方程和表格可知,需要求有n个子序列长度的LIS,就必须先求出第0个,然后退出第
原创
发布博客 2022.01.05 ·
211 阅读 ·
1 点赞 ·
0 评论

二叉树的序列化和反序列化——C++

总体解题思想为先用层次遍历存储包括空节点的每个节点,存储是每个节点都存储左右子节点,如果节点为空,则存储"#,",否则存储节点的值val,同时用逗号','分割每个节点内容,存储完后进行序列化string。反序列化则先按逗号','分割每个字符串为数组字符串vector<string> valStrArr,该valStrArr存储每个节点的值,包括空节点;然后遍历valStrArr,反向构建原始二叉树。反向构建二叉树时由于存储是按层次遍历存入的,所以反向遍历时也需要按照层次遍历依次将非空节点压栈和弹出栈。由于层
原创
发布博客 2021.12.15 ·
1272 阅读 ·
3 点赞 ·
0 评论

二叉树层次遍历(队列法、每层打印)——C++

由上面题目可知,输入是一个一维数组,输出是一个二维数组。其中输入一维数组中存储的是节点元素,输出二维数组是每层节点关键字打印。故知道该题主要考察二叉树基本的层次遍历方法,需要打印出每层节点的关键字。二叉树的层次遍历实现思路是用一个队列记录每层节点,当记录第一层节点时,弹出第一层节点进行访问,访问的同时需要遍历对应节点的左右子节点压栈;当访问完一层节点时,此时改成节点所有左右子节点都已经压栈,由于先前循环弹出了第一层的n个节点,故当前队列只存储下一层所有节点,所以只需要将该队列大小保存,然后该轮循环中弹出这
原创
发布博客 2021.12.08 ·
831 阅读 ·
1 点赞 ·
0 评论

二叉树后序遍历(递归法和迭代法(非递归法))——C++

一、二叉树后序遍历后序遍历是先遍历左子节点left,在遍历右子节点right,最后遍历父节点parent,即遍历顺序:1.2 迭代法由于后续遍历如果按照正常迭代思路去实现将不好理解和实现,仔细观察下面前序和后续遍历顺序,可以发现一个规律:前序遍历:parent ——> left ——> right前序遍历: left ——> right ——>parent,将后续遍历逆序过来遍历,则:parent ——> right ——>left通过观察1和3可以发现,两者都是先遍历父节点,再遍历左
原创
发布博客 2021.12.04 ·
266 阅读 ·
1 点赞 ·
0 评论

二叉树中序遍历(递归法和迭代法(非递归法))——C++

1.2迭代法迭代法是采用非递归方法实现二叉树的中序遍历,主要利用数据结构std::stack来实现,利用栈std::stack的先进后出特性依次压入待访问的节点,然后依次按照中序遍历顺序弹出和访问节点,确保每个节点有且仅有一次访问。具体步骤如下:a1 先将所有父节点和左子节点依次压入栈;这样做的目的是为了先弹出左子节点,再弹出父节点,可以在弹出左子节点的时候进行遍历,同时处理右节点,比如将右节点压入栈,这样就实现了先访问左节点,然后父节点,最后右子节点。a2 然后弹出一个节点,进行遍历;此时弹出a
原创
发布博客 2021.12.04 ·
539 阅读 ·
2 点赞 ·
0 评论

二叉树前序遍历(递归法和迭代法(即非递归法))——C++

​一、前序遍历递归法前序遍历递归法主要是先遍历父节点parent,然后遍历左子节点,最后遍历右子节点,具体可以参考博客:二叉树基本知识点图文介绍(全网最简洁)_净无邪博客-CSDN博客。1.1具体解法如下:递归法的要诀是找到递归退出条件和按条件分步进行递归。具体解法比较简单,直接看代码和解释即可理解。​二、前序遍历迭代法迭代法,也成为非递归法解前序遍历时,需要依靠一个栈数据结构依次遍历每一个节点。实现方法为将每个节点压入栈。注意,栈是先进后出结构,所以需要先压入右节点,再压入左节点,弹出的时候才能先
原创
发布博客 2021.12.03 ·
1278 阅读 ·
0 点赞 ·
0 评论

二叉树基本知识点图文介绍(全网最简洁)

​一、二叉树相关理论1.1定义二叉树是指树中节点的度不超过二的有序树。一棵空树或者一个节点的树也可以称为二叉树,二叉树其左右子树也各种一棵二叉树。1.2基本分类有满二叉树和完全二叉树之分。1.2.1满二叉树是所有非叶子节点都有且仅存在左右子树的二叉树。图一 满二叉树1.2.2完全二叉树是除最后一层非叶子节点外都有且仅存在左右子树,且最后一层叶子节点从左到右紧密排列,右边连续缺少若干个节点的二叉树图二 完全二叉树1.3性质性质1:二叉树第i层至多有(i>0)个节点
原创
发布博客 2021.12.03 ·
700 阅读 ·
1 点赞 ·
0 评论

桶排序算法——C++

​桶排序算法是“分治法”的典型应用,主要思路是先“分桶”(或建捅)再“合桶”。其中最关键的是“分桶”,这一步最佳的时将整个待排序数组均匀分布在每个“分桶”内,然后再对每个“分桶”内部进行排序,最后将所有排序好的“分桶”依次遍历输出即可。这个思路感觉跟“计数排序算法”和“基数排序算法”十分相识。“计数排序”是通过下标将待排序数映射到“一个桶”内,然后再逐个取出;而“基数排序”是遍历所有“基数”,然后对每个基数进行一轮“计数排序”,最后完成整个数组排序。“桶排序”的“分桶”过程也是需要将待排序元素映射到“桶”
原创
发布博客 2021.12.01 ·
354 阅读 ·
1 点赞 ·
0 评论

基数排序算法——C++

​基数排序的主要思想是选择多位基数依次进行排序,利用每次排序后还是相对有序,也就是稳定排序性质,依次比较完所有基数后,完成整个数组排序。其中,每次比较基数比如对整数进行排序时可以采用计数排序,因为整数位数有限并且每个位上的数值范围是0-9,所以最适合采用优化后计数排序对每个基数进行排序。时间复杂度为O(n + m),空间复杂度为O(n + m),其中n为数组个数,m为数组最大值位数。基数排序跟数组规模有关,假如规模很大的话,不一定比快速排序更优,故需要就具体数据模块进行分析。一、代码实现分
原创
发布博客 2021.11.26 ·
523 阅读 ·
1 点赞 ·
3 评论

计数排序算法——C++

​计数排序是时间复杂度为O(n + m)的算法,空间复杂度为O(n + m);算法思想跟散列表哈希hash有些类似,主要是利用一段有序数组计算对应元素的下表个数,然后依次输出有数组元素进行排列。基本计数排序是不稳定算法,但是优化后计数排序是稳定算法。本文主要讲解基本计数排序和优化后计数排序。使用条件:数组必须是整数或者能全部映射为整数,数组所有元素必须在有限较集中范围;一、具体实现步骤1.计算原始数组的最大值max和最小值min范围,然后创建一个长度为max--min+1的排序数组sortAr
原创
发布博客 2021.11.24 ·
693 阅读 ·
2 点赞 ·
2 评论
加载更多