自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一抹阳光的博客

记录下自己学习的点点滴滴,一步一个脚印

  • 博客(75)
  • 资源 (2)
  • 收藏
  • 关注

原创 C++——动态规划

最长公共子序列与背包问题分析与代码实现

2024-05-14 14:37:44 465 1

原创 Linux下设置桌面快捷方式(应用图标快速启动)

首先简单粗暴,首先进去/usr/share/applications/目录下,你安装的一些应用可以在这里找到,然后直接拖到桌面,就可以了!那也有一些应用在上述目录中找不到相应快捷方式,比如我安装的Visual Studio Code,类似这种的应该怎么办?也不难,就是没那么那么简单。

2022-04-27 19:34:18 5314

原创 C/C++内存对齐以及类的大小计算详解

内存对其规则:(1)结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的 offset 都是该成员大小与有效对齐值中较小那个的整数倍,如有需要编译器会在成员之间加上填充字节。(2)结构体的总大小为有效对齐值 的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。类作为一种类型定义是没有大小可言的,这里的大小指的是类的对象所占的大小,使用sizeof对一个类型名操作,得到的是具有该类型实体的大小,计算遵循结构体的对齐原则。类的大小与普通数据成员有关,与成员函数和静态成员无

2021-09-24 20:08:01 1269 1

原创 任意位置插入使括号序列匹配的方法有多少种

有一个笔试题是这样的:给定一个只含有 ' ( ' 和 ' ) ' 的括号序列字符串,可以在任意位置插入一个' ( ' 或 ' )' 使得括号匹配,求有多少种插入方法。(注:若是在任意位置插入一个括号都无法使得字符串中的括号匹配,则结果为0)。

2021-09-13 13:45:29 389

原创 字符串解码(猿辅导笔试题数箱子)

可以申请两个栈,一个存放数字一个存放字符。本题我们直接申请一个栈,数据类型设定为pair<int,string>。遍历原字符串时,遇到数字则计算保存到num中,遇到左括号 [ 则入栈,入栈后,将num置0,将字符串清空;遇到字符则进行拼接保存至res中,遇到右括号 ] 则出栈。在出栈时,首先得到栈顶数字n,然后得到栈顶字符串str,拼接的重复次数为栈顶数字指定的大小,拼接的方式为str=str+res。代码如下:class Solution {public: string..

2021-08-12 15:30:21 318

原创 最大重叠区间数目(及包装笔试题)

有一个party,许多人来参加。一个记录仪记录下了每个人到达的时间 s_i 和离开的时间 e_i ,也就是说每个人在party的时间为 [ s_i, t_i ]。求出这个party 同一时刻最多接纳了多少人。例如:输入 arrl [] = {1, 2, 9, 5, 5} exit [] = {4, 5, 12, 9, 12};输出 3代码如下:void findMaxGuests(int arrl[], int exit[], int n){ sort(arrl, arrl+n...

2021-08-02 22:25:55 921

原创 括号生成(回溯/动态规划解答)

本题有两种解题思路,一种是回溯的思想,借助树来解释;另一种是动态规划思想。首先假设n=3,说明是求解3对括号的生成结果。考虑如下二叉树:

2021-07-30 21:25:44 177

原创 循环依赖(猿辅导试题)

循环依赖可以这样理解,从i开始查找,每次查找的时候,将flag[i]=1;然后查找i依赖的值(即判断arr[i][j]==1是否存在),若不存在,则说明i不依赖于任何值,flag[i]==2,b,并返回true表明包含i值的不存在循环依赖,继续判断i++的情况;若存在,则i依赖于j,然后继续按照上述方法查找j依赖的值, 直到遇到下一个查找的值flag[j]==1,说明值j已经是这个依赖关系中的某一个,则存在循环依赖。

2021-07-29 21:29:57 566

原创 零钱兑换问题(动态规划)

采用动态规划思想:dp[i] 表示总金额为 i 所需要的最少硬币数。对于金额为i,遍历coins数组时,若coins[j]值若是大于总金额i,则说明该硬币无法用于兑换,若是小于等于总金额,则状态转移方程为:dp[i]=min(dp[i],dp[i-coins[j]]+1);即使用该枚硬币,那么总数量就是该枚硬币数 1+ 总金额减去该硬币值后剩余金额所需要的最少硬币数。即1+dp[ i-coins[ j ] ]

2021-07-25 18:54:20 1147

原创 在两个长度相等的排序数组中找到上中位数

对于两个排序数组,若是两个数组的中位数相等,则两个数组的上中位数也是该数。设置两个数组的左有边界下标分别为 l1=0,r1=n-1,l2=0,r2=n-1; n是数组的长度。中位数的下标为mid1=mid2=(r1+l1)/2。分为三种情况:arr1[mid1]==arr2[mid2],则两个数组的上中位数为arr1[mid1];arr1[mid1]>arr2[mid2],则分为两种情况讨论:①若是范围内的数据个数是偶数,即flag=(l1+r1)%2为0,则r1=mid1;l2=mid2+1;

2021-07-19 15:10:16 283

原创 多个有序数组的交集

给定多个数组,请输出所有数组的交集。例如有三个数组 [1,2, 3, 4, 5],[1, 4, 5, 7],[2, 4, 5, 8],则输出交集为[4,5]利用遍历+二分查找的方法。选定一个一个数组,假设选第一个数组,我们依次遍历数组,然后在其他几个数组中查找每一个元素,如果其他数组都有该元素,则输出,否则继续查找下一个元素。这里我们可以优化点是:用一个数组来维护查找的下标,充分利用有序数组的特点,对于以后数据量庞大的输入十分有效,就是每次查找我们将找到的位置保存在该数组中,下次查找的数一定是大于或

2021-07-08 19:46:47 2209

原创 单调栈的使用及扩展(下一个较大数、等待升温的天数、柱状图中的最大矩形)

栈(stack)是一种简单的数据结构,数据先进后出。单调栈实际上就是栈,利用一些巧妙的逻辑,使得每次新元素入栈后,栈内的元素都保持有序(单调递增或单调递减)首先考虑一个问题:给定一个数组,返回一个等长的数组,对应索引位置存储着比当前元素下一个更大元素,如果不存在这样的数,就存-1。根据每日气温列表,重新生成一个列表。对应位置的输出为:到下一次升温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

2021-07-08 17:27:11 150

原创 构造回文数的最小代价(360笔试题二)

首先,dp[i][j]表示字符串位置 i 到 j 为回文串的最少操作次数当s[i]==s[j]时,dp[i][j]=dp[i+1][j-1] ,因为i位置和j位置上的字符相同,所以位置i到j的字符串变换操作次数取决于i到j中间的字符串变换为回文串的最少操作次数。否则,说明i位置j位置上的字符不相同,那么i到j位置的字符串变换成回文串的操作次数取决去从i到j-1位置的操作次数和从i+1到j位置的操作次数,哪个小选择变换哪个。

2021-07-06 22:20:49 1556 5

原创 C++——链表内指定区间反转

首先根据参数m找到反转区间的开始节点start和开始节点的前一个节点preStart,然后在在这个区间中进行反转。(图示帮助理解)反转的思路是依次让后面的节点转换到区间的前面,循环n-m次后,指定区间内的链表反转完成。

2021-06-25 21:31:21 1912 2

原创 二叉树根节点到叶子节点和为指定值的路径

二叉树根节点到叶子节点路径的问题考察形式很多,这道是和为指定值的路径,我们使用递归,在遍历的过程中,不仅路径上的累加和要等于目标值,必须是到达叶子节点的路径和,所以判断时,我们要满足三个条件,前两个条件是当前节点的左右子树都为空(说明是叶子节点),最后一个条件是当前节点的值要等于传递的sum值。因为我们传递的sum值是目标值减去前面所有节点和,若当前节点满足三个条件,说明此条路径满足要求,我们将这条路径的节点值都存在vec中,最后将这条路径放入res中。继续递归直到所有路径遍历完毕。

2021-06-25 17:16:09 645

原创 二叉树根节点到叶子节点的所有路径和

本题使用递归,由于题目规定计算方式,也就是当前节点与孩子节点组成一个数,计算方式就是前层的累加值sum*10+当前节点值。对于根节点就是初始值sum*10+根节点值,sum设为0。注:如果是求所有路径节点值的和,就是不是题目中要求的这种计算方式,只需要将累加代码改为只累加上层结果和当前节点的值注:若是节点的值不是个位数,我们在累加的时候就不能直接sum*10累加,而是应该判断当前节点的数字的位数n,然后累加时,上层值sum应该 *再累加当前节点的值。

2021-06-25 11:12:14 753

原创 动态多态(虚函数、虚函数表、虚函数指针)

虚函数表就是存放虚函数地址的一个指针数组,虚函数指针就是指向虚函数表的一个指针。同一个类的不同实例共用同一份虚函数表,他们都通过一个虚表指针指向该虚函数表。虚函数表是在编译期间创建好的,只存在一份。实例化类对象时,编译器自动将类对象的虚表指针指向虚函数表。虚表指针是在调用构造函数时获得值的,所以构造函数一定不能是虚函数。(因为调用虚函数需要虚表指针获得地址,若构造函数是虚函数,此时虚表指针还没有赋值,无法调用)

2021-06-19 16:53:23 537

原创 C++——合并区间

对于给定的若干个区间,首先我们应该根据区间的左侧进行排序,然后遍历vector逐个比较或合并。我们可以使用sort函数进行排序,但是由于vector中的数据类型是给定的Interval类型,所以我们需要重载操作符。按照Interval的start值进行从小到大排序。

2021-06-18 22:33:17 1723

原创 C++——合并k个有序链表

对于合并k个有序链表,可以先看一下合并两个有序链表的思想,(点这里)对于k个链表的合并,我们可以基于两个有序链表的合并思想,先将两个链表合并为一个链表,再将得到的结果链表与第三个链表合并为一个链表,以此类推,最终将k个链表合并为一个有序链表。本篇不在累述这种方法,对于k个有序链表,我们可以考虑优先队列,首先将所有链表入队,然后重载比较操作符,用于构建链表节点的小根堆,依次取出队首节点,得到的新的链表就是一个有序的链表。这里有两个点需要注意:1.我们优先队列中的是一个个链表,而每次队首最..

2021-06-16 15:54:29 1445 2

原创 C++——合并有序链表

对于给定的两个链表本身是有序的,我们可以逐个向前对比两个链表L1和L2的节点大小,选择其中节点值小的链接到新的链表上,然后当前链表节点和选中的链表的下一个节点继续比较,直到两个链表中的任何一个遍历完毕,再将另一个没有遍历完的链表节点直接连接到新的链表上。(两个链表长度可能不一致,所以最后需要判断)。代码如下:class Solution {public: /** * * @param l1 ListNode类 * @param l2 ListNode..

2021-06-16 15:37:24 1198

原创 C++——数组中相加和为0的三元组

首先遍历数组,在遍历的过程中,当遍历的当前元素时,用双指针分别从当前元素的下一个元素和数组末尾元素开始扫描,计算三者和,若是满足和为0,则将双指针指向的元素push,然后双指针都继续扫描是否还存在不同的解,这时要注意判断扫描的元素是否和上一个元素相同,若相同,则忽略该元素,继续扫描(为的是防止有重复解)。若是不满足为0,则将和与0比较大小,若是比0 小,则移动左指针,若是比0大,则移动右指针,然后重复上述流程,直到遍历完所有数组值,就得到最后的解。如果题目换成指定的相加和的值target,则方法不变,将.

2021-06-09 21:44:59 777

原创 C++(TopK问题)——字符串出现次数

对于这道题,首先可以用哈希表在遍历的过程中得到每个字符串的个数,然后是根据哈希表的值进行排序的问题。采用C++中优先队列priority_queue构建自定义比较方式的小顶堆,我们写结构体com重载()运算符,比较方式为哈希表的值,当值相同时,比较哈希表的键。遍历完哈希表中的所有键值对后,优先队列中存放的就是前k大的字符串及次数值。题目要求存放在vector中,我们遍历优先队列,逐个取出放入vector中,由于是小顶堆,先出来的是前k大中最小的,所以根据题目要求,需要将vector的元素逆序转换一下

2021-06-08 16:42:11 968

原创 C++——岛屿数量

在遍历数组的过程中,若当前位置上的字符为“1”,首先将岛屿数量加一,然后将该位置的字符设为“0”并搜索该位置的上下左右位置,若为1,则置“0”并继续搜索直到四周都为0,为止,继续遍历重复此操作。说明(因为连着的陆地算一个岛屿,因此当我们遍历到“1”时,需要搜索1周围是否存在“1”可以连成一个岛屿,直到找不到相连的陆地为止,同时将这些搜索过的置为“0”,避免后面遍历的时候重复计算。代码如下:class Solution {public: /** * 判断岛屿数量 ...

2021-05-26 20:10:19 2000

原创 C++——两个链表生成相加链表

两个链表生成相加链表:就是计算两个链表的和,并将结果中每一位作为链表的每一个节点值返回。首先逐位相加应该从后从前加,因为可能产生进位,这种思想类似于大数加法的思路。如果本题返回的类型可以是数组或容器vector,就会简单很多,我们只需要获取两个链表的每一位数据存储到数组中,就可以实现逐位相加并保存,但是本题是返回一个链表,所以在处理过程中需要考虑如何将结果放入到一个链表中,或者在计算的过程中我们利用已经存在的链表进行值替换,值替换是比较容易操作的。首先我们从后向前进行加法,因此我们考虑用栈遍历保..

2021-05-25 19:51:27 821 6

原创 C++——寻找第k大的数

给出一个数组,找出数组的第k大的数:基于快速排序的思路,每次快排后,基准的左边都是比其小的数,右边都是比其大的数,一次快排结束后,若基准所处的位置正好是第k大(即基准右边有k-1个数据),则返回基准值。若基准所在的位置右边的数据小于k-1个,说明第k大的数在基准左边序列中,则我们需要对左边的数据进行快排,并找到第k-big-1大的数据;若基准所在的位置右边的数据大于k-1个,说明第k大的数在基准右边序列中,则对右边的序列进行快排并找到第k大的数。class Solution {public: ..

2021-05-24 18:50:54 4493

原创 C++——链表中的节点每k个一组翻转

反转链表的思路:遍历链表的同时进行反转,只要我们将每个节点的next指针指向前一个节点,遍历完毕就反转完毕。在改变指针指向节点时我们需要记录前一个节点temp。详细的可以查看反转链表的题链表中的节点每k个一组翻转,我们可以先向前走k个节点,每走一步之前先判断此时的节点是否为空,若为空则直接返回头节点(这说明当前不够k个节点,不需要翻转)。k步走完之后,当前节点作为带翻转的尾节点(翻转时不翻转尾节点),也是下一组的头节点。调用反转链表的函数,传入头节点head和尾节点node,得到反转后的头节..

2021-05-24 10:31:09 978

原创 C++——容器盛水问题

容器盛水问题:分别从左到右和从右到左各扫描一遍,从左到右扫描时,找到大于arr[lf]的值,形成第一个“桶”,temp用于保存“桶”里的“水量”。从左到右找到第一个桶后,将下标i赋值给lf,同时temp置0,继续遍历找到第二个“桶”,计算水量并累加至sum。然后从右遍历用相同的思想计算,这里注意的是:在从左至右遍历时,判断条件中包括了等于的情况,因此在从右至左遍历时,就不需要包含等于的情况,避免重复计算。代码如下:class Solution {public: long long m..

2021-05-23 18:59:41 583 2

原创 C++——矩阵的最小路径和

矩阵的最小路径和:动态规划思想。生成大小和输入矩阵matrix一样大小的矩阵dp,dp[i][j]表示从左上角(0,0)位置走到(i,j)位置的最小路径和,当i=n-1,j=m-1时,dp[i][j]就是矩阵的最小路径和。首先对于第一行(n=0),到达每一列的位置只能由前一列位置水平走过去(因为规定只能向右或向下走);对于第一列(m=0),到达每一行的位置只能由前一行位置垂直走过去;所以我们要单独处理dp[0][j](到达第一行的每一列位置的最小路径和,即当前位置的值matrix[0][j]加上..

2021-05-23 16:31:06 2293

原创 C++——判断平衡二叉树

平衡二叉树的性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。做这道题之前先说一下树的深度问题:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。如果我们求出树的左右子树的深度,再做差值,结果满足不大于1即说明符合平衡二叉树的性质。如何求树的深度呢?我们可以使用递归算节点的左右子树节点取较大值,代码如下:class Solution {public: int TreeDepth(TreeN..

2021-05-20 22:30:18 1288

原创 字符字面值和string对象相加(易犯错)

两个string对象可以使用+直接进行拼接,但对于字面值和string对象相加则可能是不合法的。规则:当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string。

2021-05-20 21:38:22 361

原创 C++——判断二叉搜索树的后续遍历结果

二叉搜索树:任意一个节点的值都满足大于左孩子节点值,且小于右孩子节点值。二叉搜索树的中序遍历结果是有序的。判断一个数组是否满足二叉搜索树的后续遍历结果,递归调用judge函数,该函数接收三个参数,包括带判断的序列,索引的范围。后续遍历的最后一个值是根节点的值,我们从后面开始遍历,直到找到不大于根节点的值的索引 i,这个过程是右子树的遍历;然后再遍历从索引起始点到 i 范围的值,若存在大于根节点的值,返回false;递归判断左子树和右子树是否都满足要求。class Solution {publ..

2021-05-19 16:17:22 172

原创 C++——链表倒数第k个节点

倒数第k个节点:两种思路,一种是遍历一遍链表得到总的节点数n,然后从头遍历第n-k+1个节点就是倒数第k个节点。另一种是用两个指针slow和fast,先让fast指针走k步,然后slow开始走,当fast为空时,slow正好指向倒数第k个节点。(注意判断边界条件,当k大于节点总数就是错误的情况,直接返回nullptr)【注意:如果题目改成倒数第k个节点从0开始计数,我们只需要在原有的方法基础上先进行k=k+1就好了】方法一代码如下:class Solution {public: ..

2021-05-18 15:35:34 747

原创 C++——反转链表

反转链表:遍历链表的同时进行反转,只要我们将每个节点的next指针指向前一个节点,遍历完毕就反转完毕。在改变指针指向节点时我们需要记录前一个节点temp。遍历链表时,先找到当前节点的下一个节点node,然后将当前的节点cur的next指针指向temp,最后向前遍历,把当前节点赋给temp,下一个节点node赋给cur,直到当前节点cur为空,此时说明已经遍历完尾节点,返回temp即为反转后的头节点。class Solution {public: ListNode* ReverseLi..

2021-05-18 11:28:51 2099

原创 C++——二叉树镜像(二叉树是否对称)

本题采用递归和迭代两种实现方法:递归方法如下:bool isSymmetric(TreeNode* root) { return check(root,root); } bool check(TreeNode* root1,TreeNode* root2) { if(root1==nullptr&&root2==nullptr) return true; if(root1==null..

2021-05-16 16:31:44 750 2

原创 C++——二叉树的层序遍历

二叉树的层序遍历:一般基于队列的实现首先将二叉树的根节点push到队列中。 判断队列不为空就输出队头元素。 判断当前对头节点是否有孩子节点,有则push到队列中。 循环操作,直到队列为空。代码如下:void FloorPrint_QUEUE(TreeNode* Tree) //层序遍历_队列实现{ queue < TreeNode* > q; if (Tree != NULL) q.push(Tree); //根节点进队列 whil

2021-05-11 21:08:14 8283

原创 C++——大数加法

大数加法:即运算的数据可能很大,int、long、long long无法存放,存在字符串中,但是加法的运算规则还是10进制。对于两个字符串,首先判断两者的长度,我们将字符串s设置为较长的字符串,方便后面的运算(也可以将t设置为较长的)。从低位开始逐字符取出转换为整数num1和num2,当较短的已经取完则置num2为0;然后进行加法运算(记得加上进位flag),运算过程中用flag表示是否存在进位,结果对10求整就是进位结果,对10取余得到当前位置的结果,赋值给s当前位置,直到运算完毕。最后需..

2021-05-10 20:56:09 4675 5

原创 C++——最长公共子串

对于两个字符串A和B,A的前i位和B的前j位的最大公共子序列必然是所求解的一部分,设dp[i][j]为串A前i位和B串前j位的最长公共子序列的长度,则所求答案为dp[n][m],其中n,m分别为字符串A和B的长度,若A[i]=B[j],则该元素可以作为之前构造的公共子序列的下一位元素,dp[i][j]=dp[i-1][j-1]+1,同时判断当前记录的最长子串的结果maxlen与dp[i][j]的大小,若是大于当前的最大值maxlen,则更新maxlen的值,同时记录索引位置index。直到所有遍历...

2021-05-09 14:39:48 3856

原创 C++——判断一个树是不是另一个树的子结构

递归思想。首先判断当前的两个根节点A、B都不为空时,比较两个节点的值,若是相等,则调用Result函数判断子节点是否相同,返回结果res,当结果为false,则说明以当前节点为根节点的结构不符合,则在A的左子树和右子树中查找是否有B结构,直到结束。Result函数中,首先判断B节点若为空则为ture,若B节点不为空,进入下一个判断A节点若为空,一定不满足子结构,返回false,都不为空则判断节点的值,若是相等则继续判断子树。直到结束。代码如下:/*struct TreeNode { i..

2021-05-07 11:29:04 287

原创 C++——输出源二叉树的镜像

镜像二叉树即交换原二叉树的左右子树,可以使用递归,输入函数的每一个节点,先判断该节点是否为空,为空则返回nullptr,说明空二叉树或已经遍历到叶子节点下左右节点为空,否则判断该节点的左右节点只要有一个不为空,则交换左右节点。代码如下:/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr..

2021-05-07 10:36:02 194

转载 TCP连接——三次握手

三次握手第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入EST

2021-05-06 20:39:00 538

三种优化算法实现根据两门成绩判断学生能否录取的logistic应用

用三种优化方法实现logistic回归的应用,根据学生的两门成绩,判断是否能录取。采用梯度下降法(GD),随机梯度下降法(SGD)和牛顿法(Newton)三种优化方法,绘制动态迭代图,可以动态观察决策结果以及损失函数的收敛过程。数据集和三种算法的代码均打包在一起,采用Jupyter Notebook编写(python)。

2020-07-01

四种聚类算法实现对控制图时间序列的聚类

主要针对控制图时间序列数据集的聚类任务,使用了基于划分的(K-Means)、基于层次的(AGNES)、基于密度的(DBSCAN)以及基于图的(spectral clustering)聚类方法,最后可视化结果,用Jupyter Notebook编写(python),四种聚类算法和数据集均打包在一起。

2020-07-01

空空如也

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

TA关注的人

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