- 博客(91)
- 收藏
- 关注
原创 hot100-最大子数组和
这个题目是贪心那个章节的题目,这里拿出来一下,贪心的本质就是一直取局部最优到全局最优。本题是实际就是计算最大的连续子数组的和,一开始是想用前缀和的思想,但是没写出来。思路就是一直按照顺序增加,如果增加之后比之前保存的结果要大,那么就更新为此值,但是如果此时的和小于0,那么就抛弃掉,因为之前的和小于0,那么下一轮和=小于0的前缀和+下一位位置的数字,对于下一个位置的数字,那个小于0的和只会拉低它,就直接抛弃掉了,注意并不是遇到负数就抛弃,而是当前面所有贡献对下一个位置是负的时候,才抛弃它。
2025-07-28 16:15:50
142
原创 代码随想录打卡第十九天
这里就是回溯操作,比如取1,那么它应该添加2 ,符合条件,此时就是[1,2],那么递归中(2,3,4)的for循环还没结束,所以必须把2弹出,回到1的起点,再继续递归之后继续判断。这个题目仿照上面那个很好做出来, 但是在for循环那里,执行了一步剪枝操作,比如按照示例1,当组合为124的时候符合,那么接下来就是125,但是125不符合,那么下面就是126,肯定也不符合,那么125第一次不符合,后买的就更不可能,拿就直接返回,也不要继续取递归了,直接返回12的位置,再弹出2,回到1的位置继续执行。
2025-07-27 18:25:28
392
原创 hot100-每日温度
压栈的逻辑是这样的,如果当前访问到的元素比栈顶小或者相等,就压入栈中。个人理解逻辑:那75举例子,它后面的元素都比他小,所以都不符合题目的要求,那么就继续访问,当访问到一个比较大的时候,就对栈顶进行处理,符合就弹出就继续处理,直到75成为栈顶的时候,说明它后面的元素(访问过的都不符合)都已经干掉了,69->71->75(栈底),下一个访问大72时,72大于69,就可以直接相减弹出69,变成71->75,然后72大于71,相减弹出71,71小于75,变成71->75,访问大76的时候,就可以把75弹出了。
2025-07-26 21:45:09
342
原创 hot100-把二叉搜索树转变为累加树
先理解一下这个题目,每个节点的数值=本节点数值+大于它的所有结点数值的和。二叉搜索树,所以要找到本节点和大于它的所有节点,那么应该从右子树遍历,因为右边是最大的,遍历顺序就是右中左。优化可以参考代码随想录看双指针法。
2025-07-26 18:34:58
113
原创 代码随想录打卡第十八天
先总结一个模板,这里记个笔记,递归法遍历二叉树时,遇到NULL直接返回,这是递归终止的条件。下面整个题目同样,递归终止的条件是数组大小为0,说明本届结点应该是空结点,直接返回NULL,如果数组大小不为0,取数组的中间位置为当前树(子树)的根节点,那么该位置的左边是当前根节点的左子树的数组,同理该位置的右边是右子树的数组,创建完本节点之后,递归创建左右子树,创建完毕之后再返回树(子树)的根节点。二叉搜索树,所以要找到本节点和大于它的所有节点,那么应该从右子树遍历,因为右边是最大的,遍历顺序就是右中左。
2025-07-26 18:31:21
197
原创 代码随想录打卡第十二天
此题目也是用层序遍历,处理过程是如果发现某个结点的左孩子和右孩子同时为NULL,那么就是第一次找到了叶子节点。使用层序遍历,每次遍历单层就是深度+1,直到层序遍历完看深度是多少就行。,直接返回深度+1,为什么+1,因为此层没有遍历完毕,多以手动+1;这个题目不难,使用前序遍历的方法,对结点的处理是交换左右孩子。自己试了中序遍历发现不行,直接看的题解,题解给的很简单。
2025-07-17 21:50:01
201
原创 hot100-二叉树展开为链表
自己的解法是,递归法先遍历一遍,只不过处理逻辑是在vector中存储前序遍历的结点地址,保证vector中的结点是正确的顺序,之后再把每个元素的左指针置为NULL,右指针指向下一个元素(因为vector中的顺序是正确的,直接修改就好)。
2025-07-15 12:23:18
200
原创 代码随想录第十天
这里只能根据实例来解答了,比如下面的第一个窗口,push 1时,正常push,push 3时,把1去掉在push 3 ,之后push -1,正常push,取出最大值。这道题我们可以使用栈来解题,依次遍历字符串,如果遇到的是数字,就压入栈中,如果遇到的是运算符,就取出栈中的两个元素,两次pop,之后进行运算,再压入栈中,最后栈顶元素就是运算后的结果。思路是这样,每次push一个元素,就判断前面有没有比他大的,有的话直接正常push,但是如果前面有比要push的元素小的,把那些都去掉,再push。
2025-07-14 15:08:51
137
原创 hot100-和为k的子数组
错误写法,自己开始尝试的写法是依次计算前缀和到哈希表中,之后遍历哈希表,当前的和+目标值是否出现过,其实忽略了k=0的情况,因为k=0的话,当前和+0=当前和,这个是没有避免自身,使用前缀和的思想,但是自己尝试的时候出现了错误写法。所以应该在插入之前进行判断。
2025-07-14 12:07:58
139
原创 代码随想录打卡第八天
这题的思路是定义快慢指针,初始条件为快指针比慢指针多走k步,一直前进到字符串尾部,这样可以截取后面的字串,再拼接上前面的字符串。类似栈的思想,先把字符串倒着存入,尾部的字符串先存入,再正序取出,中间再加空格,使用双指针找到字符。代码随想录的做法是先整体反转,再局部反转。
2025-07-07 15:03:49
196
原创 代码随想录打卡第六天
这道题目是哈希解法的经典题目,前面我们做个两数之和,但是这个是四数之和,其实做法类似。可以将四数之和转换为两数之和,将前两个数组求出和作为A数组,后两个数组求和作为B数组,之后按照两数字之和的解法就行。自己用的哈希但是超时了,代码随想录是双指针+排序。这道题和有效字母异构词解法相同。
2025-07-06 21:07:27
121
原创 代码随想录打卡第五天
这道题目中的关键点在于,s中字符字母及出现的次数与t中字符字母及出现的次数是否相同。可以使用哈希表解题,统计s每个字母及其出现的次数,构成键值对,<字符字母,该字符字母出现的次数>。除了上面说的三种c++哈希结构,可以直接使用数组,字母a-z只有26个,可以构建一个大小为26的数组,所以0-25分别代表a-z,数值就是字母出现的次数。代码随想录的解法更简洁,使用set只对一个去重,判断另外的数组是否出现过,出现过则保留在result_set中,没出现过则不保留,最后再转为vector。
2025-07-03 19:55:09
205
原创 代码随想录打卡第四天
需要注意的是 这里使用cur1定位到要操作的两个相邻节点的前面 要判断相邻的第二个节点是否为空,为空说明到了末尾,结束交换,并且这里cur2和cur3是记住节点的地址。第一个想法是反转链表,删除,再反转回去。可以这样处理,但是双指针更妙,使用快慢指针,设定快指针比慢指针多走n步,之后一直两个指针同时向后移动,这样他们的间距一直是固定的,直到快指针移动到末尾,这样慢指针指向的下一个元素就是要删除的元素。千万不要理解错题目 ,题目中的相邻节点,1和2相邻,进行交换,3和4相邻进行交换 不要觉得是。
2025-07-02 13:20:46
392
原创 代码随想录打卡第三天
使用的是虚拟头节点的方法。假定没有虚拟头节点,使用原来的链表结构直接操作。如果有了虚拟头节点,那么对于所有节点,包括真实的头节点,链表操作时相同的。注意 dummy node.next才是头节点,所以我们要返回的时dummy node.next。并且在链表的题目中,我们不直接操作原链表,而是新建立一个节点用于遍历操作,避免原来的那个节点在遍历中发生改变。根据前面一道题目的启发 我们可以使用头插法,及头部添加节点的方式,只需要遍历一次原来的链表就可以了。这个题目也很简单,注意虚拟头节点的使用,简化操作。
2025-07-01 20:18:48
291
原创 代码随想录打卡第一天
接下来找到中间节点,当中间结点小于目标时,证明目标节点在右侧,此时要更新左边界,left=middld+1是因为nums[middle]已经查找过middle结点了,所以跳过他;如果nums[fast]==val,证明找到了我们想要的元素,那么此时slow和fast指向的都是这个想要替代的元素,那么slow不变,fast继续+1,继续寻找下一个我们不想替换的元素,如果找到不是我们想要的元素,那么就让slow索引下的元素等于fast索引下的元素,也就是用后面不是想要替代的元素去替代我们想要替代的元素。
2025-06-29 21:29:33
339
原创 进程及相关概念
PCB就是进程控制块,我们可以在这里看到进程的所有信息,就像身份证一样,通过身份证可以了解一个人的主要信息,姓名,年龄,性别等。但是具体的比如个人喜好,个人理想等就需要深入了解,这里的PCB就是了解进程的主要信息,其中进程号就像身份证号一样,每个进程都有自己独一无二的进程号,是唯一确认一个进程的。是不是就是一个进程,答案是否定的,就像我们可以多次大开浏览器页面一样,每次打开时,都是各种独立的进程,那么操作系统又是怎么区分这些进程呢?它是由操作系统分配的,内存的申请与回收都由OS管理。
2025-02-22 16:11:57
511
原创 计算机网络基础知识(网络硬件连接 IP地址 TCP/UDP协议)
假设我们不知道网络的情况下,A电脑要发送信息給B电脑,我们可以直接用网一根线将两个电脑连接起来就行,这样AB直接可以使用网线传输数据。那么如果我们要加入第三个电脑呢?可以在两个电脑之间再连接网线。网络小白对计算机网络的通俗理解。我们首先通俗的讲解这个部分。
2025-02-17 17:09:12
154
原创 C语言学习 auto和decltyoe
auto可以自动判断所定义变量的类型,但是这个变量必须进行初始化,因为自动推断必须给点线索,如果不给线索那就没法玩了,比如 auto x;前者是错误的,因为没初始化,可以是任何类型,后者将x置为100,会自动判断为int型。auto可以和函数重载+模板联合使用。如下图的代码,定义了一个函数模板add(),当函数的返回类型是整数时,自动推断x为int;当函数返回的类型是double时,x是double。如果使用auto定义函数,会根据函数return的类型自动推断。++x是左值 x++是右值。
2024-12-25 17:39:42
374
原创 C语言学习 函数参数
这个函数的执行流程是这样的,会在执行的时候自动创建一个变量a和b,并且这两个变量的作用域或者生命周期仅仅限定在函数的内部,当执行完毕之后,会自动的销毁这两个变量。在函数中也可以使用引用参数。注意引用参数必须填入,因为引用必须进行初始化,引用是个别名,就必须指出是谁的别名。但是我们规定传入指针就不一样了,操作指针就是实际的一块内存,更改了就实际的更改了,这个函数在执行时,自动创建了两个指针,传值是把a,b的内存地址传给了这两个变量,那么我们实际操作的就是a,b的内存,直接操作内存,那么更改就是实际的更改了。
2024-12-19 20:25:47
327
原创 C语言学习 引用
这里的a和la是一样的,内存地址一样,值也一样,并且引用不可更改。并且一旦初始化引用之后,是不可修改的。引用是创建了一个变量的别名。例如 int& la{a};数据类型& 变量名称{引用的对象名称}
2024-12-18 17:29:30
107
原创 C语言学习 动态内存分配
我们可以使用malloc函数向系统申请内存,void* malloc(size_t ),在这个函数的参数中,我们传入的参数是要申请的内存大小,以字节为单位,并且是一个常量值,不能是变量值,例如malloc(10*sizeof(int)),这里int是4个字节,所以就是申请40个字节。但是这种写法还是有问题的,因为malloc申请了一块空内存,返回的只是一个内存地址,而我们接收的指针这里是int型,当然也可以是float,char等,等号左边是int*,右边是woid*,这不正确,所以还要进行类型转换。
2024-12-17 20:26:19
164
原创 C语言学习 if和switch
每个case后面有break是在执行完当前case的语句之后跳出break,如果没有的话会继续执行下一个case选项的语句,直到遇到break。根据switch的值来判断执行那个case,如果都不符合条件,那么就会执行default的语句,就是默认的情况。switch里面是数值,根据数值来判断执行哪个选项,会从符合某个选项的那个case语句开始执行,注意是开始执行。switch的执行逻辑。
2024-12-09 20:05:14
265
原创 C语言学习 位运算
对于int型的变量进行位移,也就是带符号的类型进行位移 计算机保存数字都是补码的形式保存,所以左移右移都是补码。填充空出来的低位,同时会影响原数字的符号,因为左移相当于乘以。对于unsigned 型不带符号的数据,左移还是右移都是补0。:如果你对一个正整数进行右移操作,空出的高位用。:如果你对一个负数进行右移操作,空出的高位用。(在补码表示法中,负数的符号位总是。:无论正数还是负数,左移操作都用。这是因为正数的符号位是。这是因为负数的符号位是。
2024-12-05 15:02:17
403
原创 STM32学习-段的概念_散列文件_重定位
ZI-data:Zero Initialie data,即0初始化数据,它指初始化为“0值”的可读写数据域,它与RW-data的区别是程序刚运行时这些数据初始值全都为0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。:Read Write data,即可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。
2024-11-08 11:49:20
1159
原创 STM32学习-Map文件分析
这个就是移除掉没有使用到的东西,比如我们为了方便,会把所有的库函数都加入到工程中,但可能有的库函数模块没有使用掉,对这部分进行移除,最后是一段总结性的文字,总计501未调用的模块共21820字节从映像文件中移除。ARM处理器是32位的,如果定义一个8位或者16位变量就会剩余一部分,这里就是指的“补充”的那部分,会发现后面的其他几个选项都没有对应的值。大概包含:RESET、.ARM、 .text、 i、 .data、 .bss、 HEAP、 STACK等。要翻译的话,只能说的“补充类型”。
2024-11-01 16:30:15
1386
原创 STM32学习-keil的编译过程
若编译过程无误,即可把工程生成前面对应的*.axf文件,而在MDK中使用下载器(DAP/JLINK/ULINK等)下载程序或仿真的时候,MDK调用的就是*.axf文件,它解释该文件,然后控制下载器把*.axf中的代码内容下载到STM32芯片对应的存储空间,然后复位后芯片就开始执行代码了。那么回到前面的框图中,我们可以看到很多文件都使用ARMCC进行编译,就是把我们编写的各种.c文件编译成.o目标文件 那么看最后,还会使用一个ARMLink,他是一个链接器,会把前面生成的各种.o目标文件链接起来。
2024-11-01 12:23:11
1609
原创 IMX6ULL裸机-汇编_反汇编_机器码
第一条指令,伪指令将这个数据加载到sp寄存器中,在反汇编文件中,使用到了pc,实际上,是keil在链接程序时,在pc+4这个位置保存了这个值,读到该指令时,会把这个数值加载到sp寄存器中,前面是对应这条指令的机器码 f8dfd004。下面这个指令是在A系列上的机器码,可以看到,相似的指令对应的机器码相差很多,这是因为不同系列平台上使用指令集对应的机器码不同,也就是不同架构使用的指令集的机器码可能会不同,同样,查看使用什么样的指令集就可以知道使用什么样的架构。下面是LDR指令对应的机器码。
2024-10-30 15:40:01
605
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人