自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 资源 (1)
  • 收藏
  • 关注

原创 [K210开发笔记]Linux环境下K210开发流程总结

在Linux环境下,通过终端进入 kendryte-standalone-sdk-develop 文件目录,在该目录下输入 code . 打开vscode。 打开vscode后,便可直接进入 kendryte-standalone-sdk-develop 文件目录,在该目录的src文件中编写源代码,在build文件中保存cmake编译产生的文件,也是我们最后要得到的烧录固件的保存路径。 写完程序后,进入build目录,执行以下操作: 1)CMake生成Makefile cmake .. -

2021-12-30 23:25:57 2129

原创 [LeetCode] 530.二叉搜索树的最小绝对差

LeetCode 530.二叉搜索树的最小绝对差 思路 二叉搜索树的重要特性就是有序性,通过中序遍历得到的数组是一个递增的数组,因此这道题目可以简化为在一个有序数组上求两个数的最小差值。 递归法1 把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了。 class Solution { private: vector<int> vec; void traversal(TreeNode* root) { if (root == NULL) return; trave

2021-12-27 21:53:06 452

原创 [LeetCode] 98.验证二叉搜索树

LeetCode 98.验证二叉搜索树 思路 递归法1 充分利用二叉搜索树的有序性,采用中序遍历将遍历到的节点值放入数组中,即可得到一个递增的数组,通过判断该数组是否呈现递增趋势,进而得知该二叉树是否为二叉搜索树。 需要注意的是,二叉搜索树中的元素不能有重复。 代码 class Solution { public: vector<int> vec; void traversal(TreeNode *node) { if(node == NULL) return

2021-12-24 23:43:06 460

原创 [LeetCode] 700. 二叉搜索树中的搜索

LeetCode 700. 二叉搜索树中的搜索 思路 二叉搜索树是一个具有有向性的有序树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树 因此,二叉搜索树的遍历和普通二叉树不一样 递归 1)确定递归函数的参数和返回值 传入参数就是根节点与需要搜索的目标数值 返回值是以这个搜索数值所在的结点 2)确定终止条件 当该节点为空或者找到需要搜索的数值时,就返回该节点 3)确定单层递归

2021-12-24 22:07:30 367

原创 [LeetCode] 617.合并二叉树

LeetCode 617.合并二叉树 思路 递归 仍然采用递归的“三步法”: 1)确定递归函数的参数和返回值 传入参数为两个二叉树的根节点 返回值为合并之后二叉树的根节点 2)确定终止条件 当一个树的节点为空时,则返回另一个树的节点 3)确定单层递归逻辑 假设两棵树分别为tree1、tree2,通过重复利用tree1,将合并后的元素值重新赋给tree1。tree1的左子树是:合并 tree1左子树 tree2左子树之后的左子树。tree1的右子树:是 合并 tree1右子树 tree2右子树之

2021-12-23 21:29:13 534

原创 [LeetCode] 654.最大二叉树

LeetCode 654.最大二叉树 思路 递归法的三部曲: 1)确定返回值与入口参数 2)确定终止条件 3)确定单层递归操作的逻辑 本题主要在于找到数组中的最大值,以此作为根节点,并将数组分割为左右两个子数组,从而递归的进行操作,构造左右子树。在分割左右两个子数组时,可以通过数组中最大值的索引进行分割。 代码实现 class Solution { public: TreeNode* constructMaximumBinaryTree(vector<int>& nums

2021-12-18 22:00:27 652

原创 [LeetCode] 105. 从前序与中序遍历序列构造二叉树

LeetCode 105. 从前序与中序遍历序列构造二叉树 思路 本题相对于[LeetCode] 106.从中序与后序遍历序列构造二叉树区别在于分割点,这道题的分割点在前序数组的第一个元素,后面在分割前序数组时需要将第一个元素舍弃 代码实现 class Solution { public: TreeNode *traversal(vector<int>& preorder, vector<int>& inorder) { i

2021-12-17 23:24:33 128

原创 [LeetCode] 106.从中序与后序遍历序列构造二叉树

LeetCode 106.从中序与后序遍历序列构造二叉树 思路 整体思路:由后序序列的最后一个元素确定根节点,从而将中序序列分为中序左序列和中序右序列,再根据中序左右序列在后序序列中确定后序左右序列,依次循环。 步骤: 1)判断中序与后序数组大小是否为0,为0说明为空节点 2)不为空,则将后序数组中的最后一个元素作为节点 3)以后序数组中的最后一个元素的索引作为分割点,将中序数组分割为左右两个子数组 4)将后序数组中的最后一个元素删除,并利用上一得到的中序数组左子数组的大小对后序数组进行分割,将后序数组分

2021-12-17 23:02:01 392

原创 [LeetCode] 112.路径总和

LeetCode 112.路径总和 思路 递归 1、确定返回值与传入参数 参数: 1)二叉树的根节点 2)计数器,用于计算路径之和 返回值: 如果需要搜索整颗二叉树且不用处理递归返回值,递归函数就不要返回值。 如果需要搜索整颗二叉树且需要处理递归返回值,递归函数就需要返回值。 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。(本题) 2、终止条件 让计数器初试为目标和,每次减去遍历路径节点上的数值,当计数器值为0,并且到了叶子结点(左右子节点都为NUL

2021-12-17 21:49:00 801

原创 [LeetCode] 1.两数之和

LeetCode 1.两数之和 思路 利用哈希表来解决该问题 使用map而不是用数组或者set来做哈希法的原因: 数组大小受限制,当哈希值过大时,会造成内存空间不必要的资源浪费 set是一个集合,里面放的元素只能是一个key,而这道题不仅要判断目标值是否存在,还需要记录目标值所处的下标索引位置 而map是一种key value的存储结构,用key保存数值,value保存数值所在的下标索引位置 代码 class Solution { public: vector<int> twoSum

2021-12-08 22:45:35 215

原创 [LeetCode] 15三数之和与18四数之和(左右指针法)

LeetCode 15.三数之和 思路 1)由于题目中并未明确要求返回的数值需要与原数组的顺序一致,因此可以利用sort函数先对nums数组进行遍历排序,对排序后的数组进行下一步操作。 2)经过排序后数组内可能含有重复出现的数值,会影响结果的输出,因此需要对重复出现的数值进行去重处理 3)对去重处理后的数组利用左右指针法,实现遍历满足条件的数值,当三个数的值大于0时,需要将右指针向左移动,反之,当三个数的值小于0时,需要将左指针向右移动,这样做的目的是为了缩小遍历区间 代码 class Solution

2021-11-29 23:16:03 211

原创 [LeetCode] 202.快乐数

LeetCode 202.快乐数 思路 这道题主要的难点在于如何判断当无限循环也始终变不到1的情况 方法在于: 根据题目要求计算快乐数,当出现计算结果为1时,返回true,若不为1,则用哈希表的unordered_set容器存储每一次计算得到的结果(之所以用unordered_set是因为该容器不会重复存储已有的值),因此当出现循环时肯定会在unordered_set容器中找到已存储过的计算结果,此时返回false即可。 代码 class Solution { public: int getHap

2021-11-25 22:58:28 134

原创 [Linux]Ubuntu虚拟机的有线连接图标消失的解决方法

sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start sudo gedit /etc/NetworkManager/NetworkManager.conf (把false改成true) sudo service network-manager restart 原文链接

2021-11-25 15:17:19 1482

原创 [LeetCode] 349.两个数组的交集

LeetCode349. 两个数组的交集 思路 利用哈希数据结构:unordered_set,其特点在于: 1.不再以键值对的形式存储数据,而是直接存储数据的值(对于 unordered_set 容器不以键值对的形式存储数据,也可以这样认为,即 unordered_set 存储的都是键和值相等的键值对,为了节省存储空间,该类容器在实际存储时选择只存储每个键值对的值) 2.容器内部存储的各个元素的值都互不相等,且不能被修改 3.不会对内部存储的数据进行排序 对于本题只需要将其中一个数组遍历存入unord

2021-11-24 23:53:25 162

原创 [LeetCode] 438. 找到字符串中所有字母异位词

LeetCode 438. 找到字符串中所有字母异位词 思路 利用长度为26的vector数组模拟哈希表。 step1:将字符串p的每个字符存入哈希表pMap,哈希表的第一个元素表示字母,第二个元素表示该字母在字符串p中出现的次数; step2:遍历字符串s,将字符串s中的每个字符存入哈希表sMap,并且利用滑动窗口的思想,窗口大小为字符串p的长度,在哈希表sMap中减去相应字符出现的次数; step3:当遍历到某一窗口是满足 sMap == pMap 时,则将窗口左侧索引值存入返回值数值中。 代码

2021-11-22 21:42:07 303

原创 [LeetCode] 242.有效的字母异位词

LeetCode 242.有效的字母异位词 思路 通过数组建立一个简单哈希表 step1 定义一个数组用来记录字符串s里字符出现的次数,该数组即为简单哈希表; step2 遍历字符串s,将每个字符映射到哈希表索引上,字符映射可通过 s[i] -‘a’ 的操作,计算得到该字符所在哈希表的索引值,并在该索引处记录该字符出现的次数,即 +1 操作; step3 遍历字符串t,对t中出现的字符映射到哈希表索引上的数值做 -1 操作; step4 遍历哈希表,当出现表中的值不等于0时,即可判断s与t不是有效的字母异

2021-11-20 01:12:44 344

原创 [Linux] 静态库与动态库的制作与使用

静态库与动态库(共享库) (一)静态库与动态库(共享库)的区别: 1)静态库: 在程序的链接阶段被复制到了程序中(GCC进行连接时,会把静态库中代码打包到可执行程序中去) 2)动态库: ①程序在运行时由系统被动加载到内存中供程序调用(注:在链接阶段没有被复制到程序中,即动态库的代码不会打包到可执行程序中) ②需要系统的动态载入器获取所依赖的库文件的绝对路径,对于elf格式的可执行程序,是由ld-linux.so 来完成的, 先搜索elf文件的DT_RPATH****段(在系统为进程分配的虚拟地址空间

2021-11-18 15:06:53 472

原创 [LeetCode] 142.环形链表II

LeetCode 142.环形链表II 思路 主要考察两点: 1、判断链表是否有环 2、若有环,如何确定环的入口 判断链表是否有环: 利用快慢指针法。定义fast指针和slow指针并都指向头结点,fast指针每次移动两个结点,slow指针每次移动一个结点,循环判断fast指针是否等于slow,当二者相等时,则表示链表存在环。 确定环的入口结点: 当fast指针等于slow指针时,定义一个临时结点tmp1,用于记录fast和slow相遇时的结点,并再定义一个临时结点tmp2,指向链表头结点,循环判断tmp1

2021-11-18 00:27:03 413

原创 [LeetCode] 面试题 02.07. 链表相交

LeetCode 面试题 02.07.链表相交 思路 题目的本意其实就是求两个链表相交处结点的指针,并返回该结点指针 步骤: Step1.分别用两个指针curA、curB指向两个链表A、B的头结点 Step2.求出链表A与链表B的链表长度 Step3.实现两个链表末尾对齐,并且让curA与curB在同一起始结点上 Step4.循环遍历两个链表,遇到相同的结点则直接返回 代码 class Solution { public: int getListLength(ListNode *cur){

2021-11-16 23:07:11 384

原创 [LeetCode] 24. 两两交换链表中的节点

LeetCode 24. 两两交换链表中的节点 思路 采用模拟法(创建一个虚拟头结点dummyHead(方便后续操作)) Step1.当前指针cur->next指向cur->next->next结点 Step2.将cur->next->next指向原链表的cur->next结点(需要提前保存一下) Step3.将cur->next->next->next指向原链表的cur->next->next->next结点(需要提前保存一下) S

2021-11-15 19:42:46 257

原创 [LeetCode] 19.删除链表的倒数第N个结点

LeetCode 19.删除链表的倒数第N个结点 思路 这道题是双指针法的经典应用。 删除链表的倒数第N个结点,只需要让fast指针先移动N+1个结点,然后再让slow指针与fast指针同时移动,一直到fast指针指向链表末尾,最后删除slow所指向的结点(让fast指针先移动N+1个结点的目的是为了让fast指针与slow指针之间的距离保持在N+1个结点的长度上,这样才能当fast移动到链表末尾时,slow指针刚好落在需要删除结点的上一个结点处,方便进行删除操作) 代码实现 class Solution

2021-11-15 00:17:59 117

原创 [Linux]gcc编译过程

gcc -o hello hello.c 背后的编译过程 gcc编译需要经历以下几个阶段: 预处理 编译 汇编 链接 注:查看编译的详细信息可通过如下命令: gcc -o hello hello.c -v CC1命令: 预处理 gcc -E -o hello.i hello.c 主要作用有: 查找头文件 .h 展开宏 屏蔽注释 编译 gcc -E -o hello.i hello.c 主要作用有: 将高级语言转为汇编码 检查语法错误 as命令: 汇编 gcc -c -o he

2021-11-14 23:34:36 807

原创 [LeetCode] 206.反转链表

LeetCode 206.反转链表 思路 1)再定义一个新链表(弊端:容易导致内存空间的浪费) 2)直接对原链表进行操作,改变每个结点的next指针指向的方向,从而实现链表的反转(推荐) 双指针法:定义一个指针cur指向原链表的头结点,再定义一个指针pre初始化为nullptr Step1:将cur->next结点用临时指针tmp保存一下 Step2:将cur->netx指向pre Step3:更新cur和pre指针,分别向后移动cur指针和pre指针 Step4:循环步骤1

2021-11-13 23:21:53 421

原创 [LeetCode] 707.设计链表

LeetCode 707.设计链表 思路 链表结点设置一个虚拟头结点,方便后续对链表的操作 代码实现 class MyLinkedList { public: struct ListNode{ int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }; MyLinkedList() { size = 0; dummyHead = new ListNode(0)

2021-11-13 01:13:01 869

原创 [LeetCode] 203.移除链表元素

LeetCode 203.移除链表元素 链表的定义 定义链表结点 //单链表 struct ListNode { int val; //节点上存储的元素 ListNode *next; //指向下一个节点的指针 ListNode(int x) : val(x), next(NULL){} //节点的构造函数(以初始化列表的形式进行构造函数的定义) }; 注: 若不定义构造函数,而是用C++的默认构造函数,在初始化的时候就不能直接给变量赋值! 例如: 1)通过自定义构造函数初始化节点: L

2021-11-11 23:49:16 577

原创 [LeetCode]54.螺旋矩阵

LeetCode 54.螺旋矩阵 模拟解法 思路 (1)首先定义上下左右边界 (2)其次向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,体现在代码中就是重新定义上边界 (3)判断若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,返回答案 (4)若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理 (5)不断循环以上步骤,直到某两条边界交错,跳出循环,返回答案 代码实现 class Solution { public: vector<in

2021-11-10 23:16:26 161

原创 [LeetCode] 209.长度最小的子数组

LeetCode 209.长度最小的子数组 方法一 暴力解法 思路 两个for循环,不断寻找符合条件的子序列 代码 class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int res = INT_MAX; //INT_MAX是个很大的数, //如果想得到数组中最小值,可以先将minn设成INX_MAX,

2021-11-09 22:42:25 116

原创 [LeetCode]27.移除元素及相关题目

LeetCode 27.移除元素 方法一 暴力解法 思路 由于数组中的元素在内存地址中是连续存储的,不能单独删除数组中的某个元素,只能对某个元素进行覆盖操作,因此利用两层for循环: 1) 第1层:遍历数组元素 2) 第2层:更新数组 代码 class Solution { public: int removeElement(vector<int>& nums, int val) { int len = nums.size(); for (in

2021-10-11 23:24:20 125

原创 [LeetCode]704.二分查找及相关题目

数组理论基础 数组理论 数组是存放在连续内存空间上的相同类型数据的集合 数组可以方便的通过下标索引的方式获取到下标下对应的数据 二维数组在内存的空间地址是连续的 二分查找 LeetCode 704.二分查找 二分法使用前提: 有序元素 + 无重复元素 区间的定义 区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。 二分法的区间定义分为两种 左闭右闭, [left,right] 1)while(

2021-10-09 21:31:46 458

原创 [刷题前期储备]算法性能分析

时间复杂度 大O用来表示算法的最坏情况运行时间的上界(即 对任意数据输入的运行时间上界) 算法时间复杂的排行: O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)(立方阶) < O(2^n) (指数阶) 1. 复杂表达式的简化 例如 **O(2n^2 + 10n + 1000) ** 去掉运行时间中的加法常数项O(2n^2 + 10n) 去掉常项系数O(n^2 + n) **只保留保留最高项,去掉数量级小一级的n **O(

2021-10-08 21:40:40 171

原创 【OpenCV基础笔记6】模糊操作

一、均值模糊 均值模糊实际上是使用了典型线性滤波算法中的均值滤波算法,是一种线性平滑技术,通过将图像与归一化卷积核进行卷积来实现地。它仅获取内核区域下所有像素的平均值,并替换中心元素。所谓模糊实际上是卷积在图像处理上的一种表现,也可称之为图像的平滑处理过程。均值模糊优点在于效率高,思路简单,缺点是计算均值会将图像中的边缘信息以及特征信息“模糊”掉,会丢失很多有用特征。 在OpenCV中实现均值模糊的API函数为: def cv.blur(src, ksize, dst=None, anchor=No

2020-07-06 17:58:20 370

原创 【OpenCV基础笔记5】ROI与泛洪填充

一、ROI(region of interest) ROI(Region of interest),即感兴趣区域。有时在对一幅图像进行处理分析时,需要对其特定区域进行操作。例如我们需要检测一副人像中眼睛的位置,我们首先应在图像中找到人脸,再在人脸的区域范围内找到眼睛,这样可以提高程序执行的准确性和性能,而不是直接在一副图像中进行全局搜索。 ...

2020-07-05 21:56:41 441 1

ROS操作系统.7z

ROS新手教程ROS操作系统的入门资料【ROS简介、ROS总体框架、ROS新手教程、简单的机器人仿真、创建简单的机器人模型smartcar、使用smartcar进行仿真、smartcar源码上传、语音控制、机器视觉、坐标系统、导航与定位框架、move_base(路径规划)、amcl(导航与定位)】+机器人操作系统ROS典型功能实现方法详解

2020-07-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除