- 博客(359)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 简述深度学习路线
小编简单的罗列出本人从接触深度学习,到阅读各位大佬的路线以及自身的切身体会,简单陈述一下深度学习的一个基本路线,仅供参考,如有错误欢迎指出(本人于19年年末接触机器学习,正式学深度学习从21年年初开始,20年一整年在备考)注意: 本文假定读者已经拥有一定的python编程以及一定的机器学习知识。一、入门阶段–视频为主,书籍为辅,代码其次:基础阶段个人建议可以通过看基础视频以及入门的书籍,掌握深度学习基本知识,对深度学习有个宏观的认识,搭建起大致的深度学习框架。首先推荐的入门视频当然是吴恩达老师的深度
2021-11-05 12:07:41
3084
6
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 详解随机梯度下降法(Stochastic Gradient Descent,SGD)
深度学习最常用的优化方法就是随机梯度下降法,但是随机梯度下降法在某些情况下会失效,这是为什么呢?带着这个问题我们接着往下看。一个经典的例子就是假设你现在在山上,为了以最快的速度下山,且视线良好,你可以看清自己的位置以及所处位置的坡度,那么沿着坡向下走,最终你会走到山底。∑i=1n∇θf(θ;xi,yi)+∇θϕ(θ)\sum_{i=1}^{n} \nabla_{\theta} f\left(\theta ; x_{i}, y_{i}\right)+\nabla_{\theta} \phi(\theta
2021-03-02 13:54:48
38450
14
原创 二刷LeetCode--48. 旋转图像(C++版本),数学题
思路:主要是观察变化之后的数组和最开始的数组的区别,不难发现,先转置在左右镜像对称即可。需要注意的是转置和镜像对称中for变量的终止条件。
2023-08-17 22:18:35
420
原创 二刷LeetCode--46. 全排列(C++版本),回溯
思路:本题是典型的回溯问题,需要列举出每个排列,因此使用回溯法,对每个使用过的元素进行标记,因此需要一个和Nums同样大的标记数组,每个元素被使用之后在递归之前将其标记为已使用,在递归的时候该元素就不会参与统计,同理,在回溯递归回退的时候,需要对当前的元素的标记位置改回false,以便下一次遍历使用。
2023-08-17 17:30:50
390
原创 二刷LeetCode--148. 排序链表(C++版本),必会题,思维题
思路,本题其实考察了两个点:合并链表、链表切分。首先从1开始,将链表切成一段一段,因为需要使用归并,所以下一次的切分长度应该是当前切分长度的二倍,每次切分,我们拿出两段,然后将第三段的开头赋值给一个指针,合并前面两段,下一次继续从第三段开始切分,然后继续合并。
2023-08-16 17:55:56
378
原创 二刷LeetCode--11. 盛最多水的容器(C++版本),基本题
思路:因为容器的储水量由较低的那个板子负责,因此每次我们需要移动的就是那个较低的板子,每次移动之后需要判断当前的储水量和最大的储水量谁大,将较大的赋值给最终结果.
2023-08-15 09:57:29
67
原创 二刷LeetCode--155. 最小栈(C++版本),思维题
思路:本题需要使用两个栈,一个就是正常栈,执行出入操作,另一个栈只负责将对应的最小值进行保存即可.每次入栈的时候,最小值栈的栈顶也需要入栈元素,不过这个元素是最小值,那么就需要进行比较,因此在getmin()的时候只需要将最小值栈的栈顶元素弹出即可.初始化的时候只需要将最小值栈的元素用最大值(INT_MAX)进行初始化.
2023-08-14 15:14:28
400
原创 二刷LeetCode--146.LRU缓存(C++版本),必会题目
本题思路:因为需要记录元素的出入顺序,并且每次访问之后需要将该节点提到最前面,因此需要使用双向链表(单链表不方便删除操作),而为了可以在常量时间复杂度内找到对应的元素,我们需要使用哈希表,将每一个插入的元素在哈希表中进行记录.哈希表的key就是插入的key,而哈希表的value应该对应的是双向链表的一个节点.
2023-08-14 14:42:55
118
原创 二刷LeetCode--38. 外观数列(C++版本)思维题
本题一个思路是使用递归,从n开始向前进行递归,每一次计算n-1的表达形式,一直递归下去就可以得到第n个的表达式。也可以从前面开始向后计算,从第二个开始,因为第一个就是自己,对于每一个数,计算当前对应的序列,那么就再需要一个循环计算当前序列对应的下一个序列的形式了,而且也需要一个变量记录当前序列中重复的元素,因此我们定义一个计数器,注意,
2023-06-26 17:47:24
243
原创 二刷LeetCode--36. 有效的数独(C++版本)
单纯的行和列的判断较为简单,对于每一个元素如果是数字的话就将其对应的数组下标的元素变为1(是特殊符号的话就继续读取下一个元素),对于之后的数字,就会将其与0进行对比,如果其不为0的话,那么这个元素一定出现过了,则可以直接退出。对于小方块可以发现,一个9 * 9的矩阵里面有3 * 3个小矩阵,因此我们可以使用四个for循环进行小方块的遍历,
2023-06-25 21:40:56
157
原创 二刷LeetCode--34. 在排序数组中查找元素的第一个和最后一个位置(C++版本)基本二分即可
本题的思路在于,找到第一个重复元素的位置并不难,但是怎么找最后一个位置呢,小编想法是找比目标值大的元素,大一个即可,不论原数组中是否存在比目标值大一个的元素,因为二分里面查找是按照中间位置的元素大小与目标值元素大小进行的,因此如果查找比目标值大一的元素,最终就会找到目标值右边一个的位置,然后我们只需要将该位置减一即可。二分法中每次返回的都是待查找元素最左边的下标。
2023-06-25 09:58:33
64
原创 二刷LeetCode--33. 搜索旋转排序数组(C++版本)有趣的变样式二分查找
本题因为题目对原始的递增数组进行了部分旋转,因此普通的二分就不能用了,所以相比于普通的二分,这里的二分则是需要进行第一个元素与中间元素的大小对比,来判断前半部分还是后半部分是有序的,因为,判断完有序之后,就可以在有序的部分中继续判断目标值是否存在于当前区间,如果不在当前有序区间的话,就需要对左右指针进行重新计算,然后继续进行二分判断。
2023-06-24 21:13:50
109
原创 二刷LeetCode--29. 两数相除(C++版本)核心较复杂
本题主要影响速度的地方就是while循环,如果我们使用传统的方式一次增加一个的话,时间复杂度是O(n),那么在数字比较极端的时候会导致超时情况的出现,因此就有了下图的优化情况。每次尝试减去除数的倍数,在减到导致被除数为负数的时候退出,更新被除数,然后将减去了多少个除数的计数器结果加入到最终结果中。下一轮继续这种减法,然后循环,直到被除数小于除数。本题首先容易想到的就是不断的使除数自增,通过计数器判断增加了多少次, 那么增加的次数就是想要的答案。
2023-06-20 20:56:35
108
原创 Linux基础学习之文件操作命令(which、find、grep、wc、管道符)
其含义是将左边命令的结果作为右边命令的输入,比如cat命令是查看文件的内容,然后该内容就可以作为grep命令的输入然后通过过滤的信息将我们想要看到的内容进行过滤。5、wc命令进行文件行数、单词数量等信息的统计,如果不加任何参数的话,那么其直接会依次输出字节数、字符数等信息,如果加了特定的选项的话,则会按照相关的选项进行相应信息的统计。4、在文件中通过关键字来过滤行,加上可选参数-n的话就会将行号也进行输出,在查找的关键字两旁也应该像find命令那样加上双引号,表示这是我要查找的关键字,这是个好习惯。
2023-06-20 09:57:18
194
1
原创 Linux基础学习之文件操作命令
在Linux系统中可以发现,浅色对应的是文件,深色对应的是目录,但是更为有效的区分二者的方法是使用ls -l,观察权限部分最前面那一块,如果为 d 的话就是目录,如果是 - 的话就是文件。6、rm命令是目前为止接触到首个支持无线参数的命令,其后接不同的参数,可以将这些参数对应的文件或者文件夹全部删除,同理如果需要删除文件夹的话需要加上-r选项。5、mv命令的使用类似于cp,mv之后接被移动的文件或者文件夹,参数2表示要移动去的地方,3、more支持翻页,使用方法同样是直接写被查看文件的路径即可。
2023-06-19 15:37:47
80
原创 Linux基础学习之cd、pwd、路径、mkdir
~:.表示当前目录,因此cd ./Desktop和cd Desktop效果一样,…,~表示HOME目录,因此使用cd ~就可以直接回到HOME目录。1、当终端打开的时候,我们默认的当前目录是HOME目录,当我们需要切换目录的时候就需要使用cd命令进行切换。2、如果查看我们当前处于什么目录,经常会使用ls进行查看,其实这并不实用,实际上我们可以直接输入pwd命令进行查看,其中文名字就是打印当前目录。5、mkdir之后接上相对路径或者绝对路径,表示要创建的目录,win里面我们叫文件夹。
2023-06-19 14:58:59
244
原创 Linux基础学习之目录结构、ls命令
win10上也可以从下图看出,其HOME目录是在c盘用户下的某个账号中,因此符合HOME目录就是每个用户对应的家目录的说法。2、win与Linux表示层级关系的斜杠的方向不同,一个是斜杠,一个是反斜杠,Linux中,第一个斜杠表示根目录,后面的斜杠表示层级关系。1、win系统可能有多个盘,那么就会对应多个文件树,但是Linux系统只有一个文件树,对应的也只有一个根目录,叫做 /。7、-l选项会将文件以竖向排列的方式展示,同时也展示了文件对应的用户、用户组、权限、时间等信息。9、ls还有一个-h的选项,
2023-06-19 10:14:44
407
原创 二刷LeetCode--28. 找出字符串中第一个匹配项的下标(C++版本)KMP算法例题
本题是标准的KMP算法考察问题,奈何小编功力不够,当下只用find函数草草了事,日后一定用KMP算法解决本题,然后回来再次更新文章。
2023-06-16 09:57:19
87
原创 二刷LeetCode--22. 括号生成(C++版本)回溯法例题
本题思路主要还是几种回溯法的使用,可以想象为二叉树,一直向左子树加入左括号,当加入的左括号到达最大限制,就回退到上一层,然后自然需要向右子树加入右括号,然后依次递归,还是需要注意递归的终止条件,在左右括号都达到最大的时候则需要将本次的结果存在最终的字符串数组中,
2023-06-15 22:07:13
153
原创 报错:non-const lvalue reference to type ‘std::string‘ cannot bind to a value of unrelated 不能对临时变量加引用
下面是该段代码给出的报错,大致意思是不能对临时变量加引用。如果要对临时变量加引用的话,必须在其前面加上Const,因为如果不加const的话,编译器会认为下面代码会修改这个临时变量,而且这个变量将会被返回并且对代码有一定影响。小编在写LeetCode–22.括号生成的时候发现传值的时候一个小问题,代码如下。下午是从隔壁搬运的,这是链接,说的很好。
2023-06-15 20:55:18
620
原创 C++学习之虚指针与虚表(动态绑定、多态)、this指针(侯捷老师)
2、静态绑定一定是通过call函数,调用某个特定的地址,而动态绑定,是通过指针来调用;之后,这个指针必须是向上转型,比如是class C的指针,但是该指针实际上包含A的特性,那么就属于向上转型;至于调用哪个函数呢,需要看p指针指向的是什么。这里也可以理解多态,虚机制,动态绑定,实际上他们三个基本上是一码事。1、class A有虚函数,因此会有虚指针,虚指针(virtual pointer)指向一个表即虚表,virtual table,虚表中存放的都是函数指针,指向虚函数(非虚函数不用管)。
2023-06-15 10:34:33
364
原创 C++学习之引用与指针(侯捷老师)
2、引用常见的使用就是在于参数传递这里,函数调用的时候使用的和传值长相一样,但是在函数定义的时候我们要声明参数为引用。在函数体内使用该引用的时候也是与直接传值的使用方式一样。但是传引用比传值快,因为引用的底层也是使用指针执行。1、引用就是原来的变量,老师讲引用代表原来的变量,而指针指向原来的变量,从下面的图可以看出,指针的大小是4个字节(32位机器),但是引用还是8个字节,
2023-06-14 22:13:47
82
原创 二刷LeetCode--19. 删除链表的倒数第 N 个结点(C++版本)
本题主要是需要注意leetcode上head指针指的是第一个数据节点,而不是我们平时习惯的头节点,因此计数的时候需要注意,本人使用算出正数的第几个数据,然后找到其前驱节点进行删除。
2023-06-08 11:42:42
82
原创 LeetCode中单链表的head是头指针还是头节点
头节点是在链表的第一个数据节点之前,而此时的头指针指向的实际上是头节点,头节点可以不带数据,也可以带一些特殊的数据比如链表长度等,这种情况下判断链表是否为空就可以使用if(head -> next == NULL)。而头指针一般指向的是链表的第一个数据节点,而这也是力扣上单链表的head所表示的含义,因此力扣上写相关单链表的问题可以注意,有一些题比如删除倒数第k个链表这种题,如果使用总数减去所给数拿到正数的数字然后进行遍历的话,需要注意此问题否则会导致计算的链表长度出错。然后计数的时候就会导致错误。
2023-06-07 22:05:28
702
1
原创 二刷LeetCode--17. 电话号码的字母组合(C++版本)基于回溯算法
对于本题而言,需要将结果放在一个字符数组中,因此我们需要维护一个临时的字符类型的临时变量,每次将临时变量放入到最终的结果数组内。每次遍历到一个数字,就对这个数字对应的全部字符进行深度优先遍历,这里的index对应的就是digits中的每一个字符变量(也就是字符数组digits的下标)。对于每一个digits的数组的数字,都对应有三个或者四个字符,那么这些字符就是我们需要获取到的并将其放入到临时变量中。
2023-06-06 21:02:06
87
原创 二刷LeetCode--15. 三数之和(C++版本)
本题思路较为简单,使用枚举的方式即可完成.首先枚举第一个数字,那么后面的两个数据的和应该是第一个数据的相反数,为了加快比较效率,我们对原始的数据进行排序,那么如果上一个和这一个数据相同的话就不需要再进行枚举.而且对于第三个数据来说,我们可以使用两端数据相加和与目标值的大小来判断第三个数据应该在的位置,也可以加快比较速度.
2023-06-06 15:17:32
65
原创 C++学习之虚函数和多态(侯捷老师)
2、下面是虚函数最重要的一种用途:我们使用子类创建一个对象,通过该对象去调用父类的函数,当调用到虚函数的时候,系统会发现该函数在子类中有覆写,因此回到子类里面进行函数操作,之后再去父类进行操作,然后回到主函数。非虚函数,你不希望子类重新定义他。
2023-06-05 16:42:01
66
原创 C++学习之组合与继承(侯捷老师)
实际上,我们知道deque指的是双端队列,而queue只是普通的先进先出的队列,因此双端队列的功能更加强大,所以队列的很多函数的实现可以直接使用双端队列中已经实现好的函数。3、委托:通过指针委托别的类进行本类中函数的设计,好处是将来需要类实现别的功能,我们直接将其指向另一个类就可以,换句话说,不需要对当前类进行改动就可以实现类的功能的改进。可以注意下面函数调用的顺序,构造的时候是父类写在外面因此先调用父类,析构的时候将父类的析构函数卸载了内部,因此是后调用父类的析构函数。继承的主要使用还是搭配虚函数一起。
2023-06-05 15:10:26
172
原创 C++学习之堆、栈与内存管理(侯捷老师)
构造函数这里可以发现实际上省略了this指针,谁调用构造函数this指针就是谁,那么这里this指针就是新的变量即pc。实际上,按照下图右上角的写法可以知道,析构函数我们会将该变量指向的那一块动态申请到的内存空间释放,然后再调用operator delete函数(实际上是free())进行该变量本身(也就是一个指针)释放。1、第一行的内存空间在栈上,无需手动释放,作用域结束之后该变量会自动销毁。,只有带了方括号,在运行delete的时候才会执行三次析构函数进行对应指针指向的内存空间的释放,
2023-06-01 16:39:58
89
原创 C++学习之三大函数:拷贝构造、拷贝赋值、析构(侯捷老师)
2、浅拷贝,如果不写拷贝构造的话,直接使用系统的赋值,会导致内存泄漏,如下图所示,b=a(b的指针会指向a,因为data里面只有两个指针,如果a指向的内容更改的话会影响到b,并且原先b指向的内容泄露)。1、第一行就是正常的构造函数,给指针赋初始值为0,第二行因为构造的内容也是自己的这种类型因此叫拷贝构造,同理,第三行的重载也是重载的自己本身类型的东西,因此叫拷贝赋值,最后一行是析构函数。3、深拷贝,首先开辟足够大的空间来存放另一个数据的蓝本,然后再将数据存放在该空间上。
2023-06-01 15:26:59
92
原创 C++学习之操作符重载与临时对象(侯捷老师)
2、什么情况不可以返回引用而需要返回值呢?答案:当创建的为临时对象的时候不能返回引用,因为本行结束之后临时对象会被销毁,而外面通过引用来访问该对象的时候就会导致错误。这里创建临时对象的方法是类名之后直接加括号,而不是像之前那样实例化然后进行创建。1、this指针:谁调用,这里的this就是谁,实际上this指针是这个调用者的地址,这里我们可以看到,this是c2的地址。操作符实际上是一个函数,C++支持对这个函数进行重载,我们使用成员函数即在class中进行重载。下面的就是生命周期只有运行的哪一行的演示。
2023-06-01 11:28:39
63
原创 C++学习之参数传递与返回值(侯捷老师)
1、传递参数or传递指针(引用):传递参数的话可能传递很多,导致传递的速度变慢,那么传递指针的话一般效率比较高并且传递的速度也比较快,这里我们说的指针实际上是reference也就是引用。因此我们应该建立良好的习惯,传递的时候直接传递引用而不是传值。注意,传递地址的话可能存在的情况是,在函数中对这个值进行了改变,那么就会影响外面这个值,因此我们可以考虑使用const进行引用的传递来避免这种情况。而且同一个class中的不同函数之间互为友元,因此下面途中直接对复数的实部虚部进行提取是被允许的。
2023-05-31 20:48:17
139
原创 二刷LeetCode--11. 盛最多水的容器(C++版本)
本题算比较简单的,从一侧进行遍历势必会导致超时,这种情况一般我们使用两边向内遍历的方式较好,每次比较新位置的盛水量,然后与当前的最大值进行比较,将较大的留下进行下一次比较。
2023-05-31 19:55:36
59
原创 C++学习之构造函数(侯捷老师)
因为初始化是构造函数独有的,因此推荐我们学习初始化这种较为正规的写法进行构造函数初值的处理。这里说的是不带指针的构造函数,一般不需要写析构函数,但是后面涉及到带指针的话,比如字符串那种,一般就需要写上析构函数。2、访问级别:私有成员即private里面一般写的是变量,所以不能让外面访问,而public里面一般写的是函数,函数支持别人调用,因此可以公开。下面的例子也表明了,通过实例的函数进行实部虚部的访问可以,但是直接通过打印的方式获取实部虚部是会出错的。3、构造函数:首先,
2023-05-31 16:17:11
107
原创 C++学习之头文件与类的声明(侯捷老师)
2、标准的头文件写法(防御式声明):在写头文件的时候,下面的写法较为标准,即需要表示该内容如果没有被编译的话那么才进行下面的函数体,否则不会对下面的内容进行编译,按照老师的讲法,这样避免了多次引用该文件,而对相同的内容进行多次编译的情况,程序会报错。1、C++代码的基本形式如下,需要一个.h文件来进行类的声明,之后通过.cpp文件进行具体的操作,同时可能会使用到标准库的东西,因此经常也会对标准库进行引入。
2023-05-31 15:22:32
260
原创 二刷LeetCode--8. 字符串转换整数 (atoi)(C++版本)
这个题需要注意的是越界的判断,如果不能记住2的31次方的话可以使用pow函数进行计算,然后依次进行字符的读入即可,在计算的时候需要将字符转化为数字进行计算.最后需要与现有的结果和越界值进行比较,如果越界了需要按照题目的要求进行取舍.
2023-05-30 15:49:49
56
原创 二刷LeetCode--3. 无重复字符的最长子串(C++版本)
这里的第二种方法是我们本次使用的,即用哈希表和滑动窗口进行解答,滑动窗口依次将每一个元素做为起始位置的无重复子串进行判断并与当前的最长子串长度进行比较,将较大的赋值给最终结果,这里不使用unordered_map是因为其是键值对的组合,在插入以及判断元素是否存在的时候不如unordered_set方便,因此选用后者作为基本数据结构进行。
2023-05-29 21:53:54
64
原创 二刷LeetCode--7. 整数反转(C++版本)巧妙思路
这里我们使用两种方法进行作答,首先是将字符转为字符串,字符串反转,然后进行字符串转为数字,但是需要判断的是转换之后的数字是否超出了界限,因此比较巧妙的是使用C++的异常处理机制。方法二就是每次取出最后一位数字然后依次进行加和,完成数据的反转,但是需要注意,临时变量可能会出现溢出的情况,因此要对临时变量的数据类型变为长整型。
2023-04-21 22:05:35
79
1
原创 二刷LeetCode--2. 两数相加(C++版本)
本题采用正常的思路,即两个指针对应位置进行相加,头指针不动,尾指针一直向后滑动进行计算,主要加法运算需要考虑进位的情况,因此每次计算结束之后如果进位的标记不为0,则尾指针需要再向后走一步。
2023-04-19 11:26:01
143
原创 二刷LeetCode--350. 两个数组的交集 II、234. 回文链表(C++版本)
本题第一个方法较为简单,将元素存储至数组中然后进行常规的双指针遍历。第二种方法较为复杂, 原地进行题目的求解,避免了额外空间的申请,首先使用快慢指针进行链表的分割,快指针一次走两步,慢指针一次走一步,慢指针最终会停留在中间位置,然后使用自定义反转链表的函数将后半段反转,使用反转后的头开始向后遍历,与之前的前半段进行比较,完成题目。本题对其中一个数组元素的出现次数进行记录,然后在下一个数组中查找每一个元素之于上一个数组的出现次数,当出现次数不为零的时候就将当前元素加入到结果数组中。
2023-03-31 21:00:04
81
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人