- 博客(87)
- 收藏
- 关注
原创 leetcode63.跳跃游戏2(动态规划)
断对应的节点是不是有障碍,如果有,直接返回0,没有就必须知道到达dp[i - 1][j]有多少条路径,还有到达dp[i][j - 1]有多少条路径,这两条路径不是二选一,而是全都满足条件,所以应该全部加到。dp[m][n],应为添加了虚拟节点,数组也变大了,所以要求的结果是对应dp[m][n],其中m是行数。其实在添加了一行一列辅助虚拟节点之后,最需要虚拟节点的是原来的第一行和第一列的dp数组表。那么元dp数组的左上角应该填的是什么,从起点出发到达起点只有一种方法,所以应该填写1,但。
2024-05-09 16:25:09 738 1
原创 leetcode746.使用最小花费爬楼梯(动态规划)
所以dp[i]的状态转移方程为:min(dp[i - 1] + cost[i - 1] , dp[i - 2] + cost[i - 2]).所以dp[i]的状态转移方程是:dp[i] = min(dp[i + 1] + cost[i], dp[i + 2] + cost[i]).dp[i]可以选择前一个台阶即[i - 1]的位置然后向上走一步,这时的花费为dp[i - 1] + cost[i - 1],对应的。dp[i]表示到达i位置的最小花费,下面就要用前面的dp值以及cost值来表示dp[i]
2024-05-08 15:46:41 1179
原创 leetcode45.跳跃游戏||
对应right和left都从0开始,通过left到right这段区间来找出最大的跳数,找到后,现将其和数组的长。度进行比较,如果小于,将left更新为right + 1,将right更新为最大跳数,同时步数++,最后在回到。可以用双指针来不断表示每一个数字可以跳跃的范围,再去遍历这段范围来找到这段范围里能到达。的最远的地方,将其统计然后与数组的长度进行比较,如果小于数组长度,则继续循环,否则直接。找最大条数,执行循环,知道最大跳数的值大于或等于数组长度,返回步数。向前跳转的最大长度。处,你可以跳转到任意。
2024-05-06 12:36:11 378
原创 leetcode455.分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。首先一定要注意同种虽然给我们的例子都是有序,但题中并没有提到那个数组是有序的,对于胃口。最小的尺寸的饼干,如果有一个尺寸的饼干不能满足最小的胃口的孩子,那么直接舍弃这块饼干,这里是与田忌赛马的区别不用将小的做牺牲,这也是贪心算法的体现,注意要判断满足之前要看每。和尺寸的大小的问题类似于田忌赛马问题,所以需要将两个数组先排序,在到能满足小孩胃口的。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。,这是能让孩子们满足胃口的饼干的最小尺寸;
2024-05-04 15:45:57 171
原创 leetcode942.增减字符串匹配
本题其实就是根据所给的增减顺序来使0~n的数满足这个顺序,其实横简单。小的数,下降的时候给最大的数,这样就可以保证上升的时候再随便来一个数都是上升的,下降的。如果有多个有效排列perm,则返回其中。个整数的排列序列可以表示为长度为。
2024-05-04 11:48:58 349
原创 leetcode409.最长回文串
元素其中必须要保持左右两边的元素关于中间对称,再次简化,我们只用统计字符个数,如果字符。个数是偶数,直接将其加到最终长度之中,应为将此字符对半放在对称的两边,该字符串一定还是。回文的,如果是奇数,就将其转换成最大的偶数在加入到最终长度之中,与上面所描述的一样,最。后考虑在对称的最中间是否可以放入元素,也就是判断是否还有元素剩余,可以将最终长度和原来。字符串的长度进行比较,如果相等,说明没有剩余元素,否则,将最终长度再加1,可以将任意一。个剩余元素加入到回文字符串的最中间。在构造过程中,请注意。
2024-05-04 11:10:04 345
原创 leetcode870.优势洗牌
要用nums2的初识顺序来决定nums1的最终顺序,我们可以用一个下标数组来记录nums2对应的下。过nums2的最小,直接将nums1的最小放在最后,取对抗最大的那个数,反之,如果nums1对应的。nums2的排序,而最终在对nums1排序的时候使用的是田忌赛马的方法,如果nums1的最小比不。比大小的方式俩对nums1进行重新排序,但是在比较的排序之前必须记录nums2的初识顺序,应为。比nums2的值大的数目变的最多,所以我盟首先要做的工作是将两个数组排序,排序之后在通过比。给定两个长度相等的数组。
2024-05-02 14:51:02 363
原创 leetcode2418.按身高排序
通过一个lamda表达式来改变index的排序策略,从而通过index数组的下标记录来队名字有了降序。就是创建一个身高:名字的哈希表,先将每个人名字和身高的对应信息存入哈希表中,然后再将升。高降序排序,最后再将升高对应的哈希表中的名字取出,就返回了对应的按身高降序排序的名字,这种方法才是本道题的最优解,设置一个下标数组,通过对身高的排序对下标数组进行排序,然后。这种方法是最常见的,但并不是最优的。顺序返回对应的名字数组。这就是这道题的两种解法。
2024-04-23 15:17:25 240
原创 lettcode1005.k次取反后最大的数组和
直接返回结果,因为剩余的转换次是偶数次,相当于取一个数进行不停的转换偶数次,最终结果还。对应的转换次数是奇数次,对应必须要有一个数转换成负数,为了是数组和最大,所以需要找到数。直接将前k小的数组中的负数转化成正数,然后返回数组和。组中最小的数将其转换成负数,再将数组的和返回即可。以这种方式修改数组后,返回数组。是这个数本身,所以可以直接返回。可以多次选择同一个下标。这就是这道题的解法。
2024-04-22 17:43:33 367
原创 leetcode122.购买股票的最佳时机||
这道题与购买股票的最佳时机|的不同就是,在每一天都可以决定是否要出售或者购买股票,所以。也就以为这我们只需要在股票上升的阶段结束之前将其买掉就能活的最大利润,通过一个折线图演。其实双指针的方法是更好的,应为它对应的+=次数少,解法也就更优。对应只要获取到折线的上升区间,就是这段股票能获取的最大利润。在每一天,你可以决定是否购买和/或出售股票。其实不断的找上升区间就是贪心算法的体现。你也可以先购买,然后在。
2024-04-22 16:17:21 334
原创 leetcode121.买卖股票的最佳时机(贪心算法)
要想找到买卖股票的最佳时机,就有需要持续关注股票的最低点和最高点,当然因为题目要求,一。通过每天的股票价格和最小值的差值来更新最终结果,再更新最小值,其中的最小值就是贪心算法。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回。定要找到最低点之后再取寻找最大利润,要一直更新最大利润。设计一个算法来计算你所能获取的最大利润。定义两个变量,一个是最终结果,一个是最小值。这就是买卖股票的最佳时机的贪心解法。这就是解决示例一的具体流程。买入这只股票,并选择在。
2024-04-19 17:12:29 325
原创 lettcode334.递增三元子序列
如果满足上述条件,直接将nums[i]赋值给b,比a大比b小,说明将其替代b可以得到更有的解,这。创建两个变量分别是a,b,将a初始化成已给数组的第一个元素,将b初始化成int的最大值,这道相对比较简单,只需要设置连个变量,通过一次遍历和几次比较就可以非出答案,具体的解法。如果满足,直接返回,对应找到了递增的三原子序列,当然在第一次是不可能的,最少遍历两次才。在不满足上述条件的情况下,再次判断nums[i] > a。直接将num[i]赋值给a,这里也是贪心算法的体现。在不满足上述所有条件的情况下,
2024-04-19 16:25:12 286
原创 leetcode376.摆动序列(贪心算法)
我们可以定义两个变量,left和right,其中left用来记录当前点和前一个点的差值,right则用来记录。(2)取中间的有效点,中间的有效点的left和right的正负一定是不相同的,所以也包含了这种情。如果碰到连续并且值相同的点,那么就一定会有right == 0,我们队连续的点事不做处理的,直接。(1)取第一个点,无论如何,第一个点的left一定是0,所以乘积也一定是0,这里包含了这种情。也是利用贪心算法,在一段上升区间取其最大的值,在一段下降区间里取其最小值,画出折线图以。
2024-04-19 15:49:40 461
原创 lettcode179.最大数
(1)ab > ba(这里的ab是将数据b添加到数据a的前面) ——> a在前,b在后。最后,题目要求输出的是字符串,所以有一个优化是可以在开始就将数组中的数字全部转化成字符。串,同时这样也有利于排序的比较,不用将整形数字拆分来比较,直接比较即可。,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。设有两个元素a和b,一定要保证这两个元素是可以比大小的,所以满足全序关系,说明我们规定的排序是正确的。(3)ab < ba——>b在前,a在后。a在前 && b在后 ——>无所谓。
2024-04-18 17:22:37 213
原创 leetcode2208.将数组和减半的最少操作次数(贪心算法)
nums 的和减小了 33 - 14.75 = 18.25 ,减小的部分超过了初始数组和的一半,18.25 >= 33/2 = 16.5。nums 的和减小了 31 - 14.5 = 16.5 ,减小的部分超过了初始数组和的一半, 16.5 >= 31/2 = 15.5。最终数组为 [5, 4.75, 4, 1] ,和为 5 + 4.75 + 4 + 1 = 14.75。注意在减去数组最大值的一半后需要将数组中的最大值删除将最大值的一半放入,从而再次寻找最。这是第一种情况下,贪心解可以与最优解交换。
2024-04-18 15:19:49 416
原创 leetcode:860.柠檬水找零
这是一道经典的找零问题,初识的资金是0,需要通过想顾客买水来获取资金,再通过获取到的资金来向用户找钱,如果到最后一个顾客钱还是可以找开,就返回true,否则返回false。将5元的计数--,将10元的计数--,这里不用设计20元的计数,因为20元是没法找出去的。可以将 10 + 5,和 5 + 5 + 5的位置互换,也可以调整成贪心解。需要判断有没有之前顾客给的5元钱,所以需要用一个变量来记录5元钱的个数。有5元钱:直接找给顾客,将自己的5元计数--,再将自己的10元计数++
2024-04-18 12:28:54 441
原创 网络编程套接字
端口号是用来表示一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理。其实client的port是多少,其实不重要,只要保证主机上的唯一性就可以了。接受主机把从网络上接到的字节依次保存在缓冲区中,也是按内存从低地址到高地址。内存中的地址有大端和小端之分,那么如何定义网络数据流的地址呢?IP地址 + 端口号能够表示网络上的某一台主机的某一个进程。网络协议中的下三层,主要解决的是数据可靠的运送到远端机器。对应的inet_ntoa是将整形的ip地址转换为字符串。
2024-01-31 19:22:38 612
原创 网络的基础
几乎任何层协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪一个协议的能力(分用)mac:mac地址,出局域网之后,源和目的mac地址都要被丢弃,让路由器重新封装。对于两个用户直接通行,对应网络层的报文段中有对应的源ip地址和目的ip地址,需要通过路由器进行转发,而路由器在转发过程中通过和数据链路成的转换关系,ip:ip地址,尤其是目的ip,一般是不会改变的,协助我们进行路径选择。其中五层协议中最重要的传输层和网络层就是操作系统中的板块。IP实现了全球的软件的虚拟层,一切皆是报文。
2024-01-31 19:13:12 510
原创 进程间通信
一般的操作系统,会有一个独立的通信模块 —— 隶属于文件系统 —— IPC通信模块定制标准 —— 进程通信是有标准的 ——system V && posix。2.共享内存的删除不是直接删除,而是删除进程与物理地址的映射关系,到映射链数为0的时候,才为真正的删除。1.key对应是一个int,至于数字是多少不重要,重要的是它的唯一性,能够让不同的进程执行唯一标识。对应的key都是面向系统内核的,id都是面向用户的。如果两个不同的进程,打开同一个文件的时候,在内核中,操作系统会打开几个文件?
2023-12-05 11:15:13 110
原创 linux信号
可以看到在优化情况下对应捕捉到2号信号后,对应的flag置为1,但是main中的循环还是不结束,很明显while循环中的flag和handler中的flag已经不是同一个flag了,这就出现的二义性的问题了。在linux中,一个终端,一般会有一个bash,每个登录,只允许一个进程是前台进程,可以允许多个进程是后台进程,大部分可执行文件执行起来是后台文件。4.一个进程在信号产生,到信号被处理,就一定会有时间窗口,所以进程还有具有保存信号的能力。所以在是有信号捕获子进程退出的时候,最好用等待的方式来进行退出。
2023-12-05 11:09:04 197
原创 文件基础IO
在学习c++的时候一定看过对应一些代码的反汇编,其实反汇编后面的函数,还是指令对应都已经转化成了地址,而且是虚拟地址,对应方便我们在进程地址空间中找到它,并映射到真正的物理地址,并执行操作。这个接口的命名比较绕,需要更好的理解,对应的含义是让newfd成为oldfd的一份拷贝,最终意味着olded是最终保存在newfd的,所以如果我们要实现上述的操作,用来将比特位的位置和对应的块号映射起来,比特位中的1,0来表示文件内容,块有没有被使用,在删除文件的时候,直接将对应的比特位置0即可。
2023-11-12 15:33:38 172
原创 进程程序替换
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动。linux中形成的可执行程序,是有格式的,ELF,可执行程序的标头,程序入口地址就存放在表头中。如果这些函数调用成功则加载新的程序从启动代码开始执行,不返回,没有返回值。环境变量也是数据,在创建子进程的时候,环境变量已经被子进程继承下去了。可以发现在调用完进程序替换以后,再不会执行main函数后面的代码。
2023-10-29 11:23:45 117
原创 进程地址空间初识
增加进程虚拟地址空间可以让我们在访问内存的时候,增加一个转换的过程,在这个转换过程中,可以对我们的寻址请求进行审查,所以一旦异常立即拦截,该请求不会到达物理内存。cpu中会有一个cr3地址寄存器来寄存页表的地址,这样每次一个进程开始的时候就会找到对应的页表地址,从而做到了进程的独立性、对应的变量先通过进程地址空间产生一个虚拟地址,再将虚拟地址与物理地址通过页表对应,产生物理地址,细节后面会有。地址空间本质是一个数据结构对象,类似pcb一样,地址空间也是要被操作系统管理的:先描述,再组织。
2023-10-19 14:37:51 123 1
原创 c++11
这两种初始化方法看似相同,其实是有区别的,vector的初始化{}里面可以随便添加元素,但p1只能添加两个元素。上图的typeid对应的只能打印出对象的类型,不能直接使用,而的decltype则可以。主要是用{}来初始化一些内置类型和自定义类型,如上图,对应的初始化都是正确的。对应的框柱的那个构造函数就是c++11新加的可以去添加元素的构造函数。对应的都可以初始化,而且调用的都是构造函数。左值引用给右值引用取别名:加const。能取的就是左值,不能取的就是右值。左值引用:给左值取别名。
2023-09-25 14:12:40 105
原创 哈希表的模拟实现
对应的容量不够了还要进行扩容,这里直接将扩为两倍,然后再将旧表的数据插入新表。2.如果要插入的位置已经有元素了,就使用线性探测找到下一个空位置直接插入。2.不管元素重复不重复,都将其头插在对应的位置的链表中即可。其实就是一个指针数组,每一个位置可以像链表一样向下延伸。可以看到各个方面hashset是优于set的。还有寻找和删除的实现,都比较相似。1.闭散列(线性探测)2.开散列(哈希桶)
2023-09-25 14:10:34 258
原创 位图的实现,布隆过滤器
3.位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数。由于位图是通过一个比特位来判断是不是在范围里面的,所以其对应的时间复杂度都是O(1)的。2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?要想实现位图,就得知道我们要记录的这个数应该存储到哪个位置,假设这个数是x。x % 32 所得的值就是对应在此字节的第几位上,这样一来位图就简单了。要找到只出现一次的整数,就要让出现一次和出现多次的数有所区别,2.精确的场景,布隆过滤器。
2023-09-21 12:59:27 64
原创 红黑树插入的实现
3.如果对应的grandparent的父亲是红色节点,则需要将cur = grandparent,再次进行循环。这种情况只需要将parent和uncle节点都弄成黑色,对应的grandparent节点弄成黑色。分别进行左旋或者右左双旋,再将parent/cur变为黑,grandparent变为红即可。分别进行左旋或者右左双旋,再将parent/cur变为黑,grandparent变为红即可。再将parent变为黑,grandparent变为红。再将cur变为黑,grandparent变为红。
2023-09-19 14:16:09 91
原创 AVL树的实现
5.更新后平衡因子==2 or -2,说明parent所在的子树高度变化且不平衡,对parent所在的子树进行旋转,使其平衡,平衡之后自然退出循环。3.更新后平衡因子==0,说明parent所在的子树高度不变,不会影响祖先,所以不用沿着root路径继续向上更新了,直接跳出循环并结束。4.更新后平衡因子==1 or -1,说明parent所在的子树高度变化,会影响祖先,所以需要沿着root1路径继续向上更新,循环继续。可以理解为第一次只是预处理,将其变成parent == -2,cur == -1的情况。
2023-09-13 22:52:57 105
原创 leetcode.105 从前序和中序遍历序列构造二叉树
题目要求通过前序遍历和中序遍历来构造二叉树,首先得明白前序遍历,分别是根,左子树,右子。树,中序遍历则是左子树根右子树,如此便有迹可循了,首先通过前序遍历可以确定二叉树的根,假设root为根,从前序遍历的第一个元素,通过root,根据中序遍历,可分为。之后再将前序遍历中的下一个元素作为root,再进行递归遍历左子树和右子树。再通过中序遍历来确定左子树和右子树,再通过递归遍历来构成二叉树。前序遍历:根 左子树 右子树 (用来确定根),请构造二叉树并返回其根节点。
2023-08-27 15:38:06 308
原创 JZ36 二叉搜索树与双向链表
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。将搜索二叉树转换成一个排序的双向链表,从二叉树的性质可以知道其中序遍历对应的是有序的,所以形成的双向链表的顺序必须跟着搜索二叉树的中序遍历走,这样才保证是有序的,其次我们需。要将二叉树的左右指针当做双向链表的前后指针,左为前右为后,从而通过中序遍历来确定双向链。3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构。输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。2.返回链表中的第一个节点的指针。
2023-08-24 14:50:19 88
原创 进程的概念
当进程退出并且父进程没走读取到子进程退出的的返回代码时就是僵尸状态。2.僵尸状态一直不出,pcb就一直要维护。父进程提前退出,子进程就成了孤儿进程。1.长时间不进行删除会导致内存泄漏。会被1号进程(系统进程领养)。HOME:指定用户的主工作目录。PATH:指定命令的搜索路径。SHELL:当前的shell。3.导致内存资源的浪费。
2023-08-23 11:11:45 112
原创 stack,queue,deque的使用
3.deque结合了stack和queue还有vector,他们的接口在deque上都有体现,但其实没必要,这么。这就是stl中的queue,deque,stack。其分别为入栈,出栈,取栈顶元素,判断栈是否为空。
2023-08-21 12:51:12 85
原创 list使用
对应的insert的使用需要注意的是其不想string一样可以使用迭代器重载的“+”号,因为list是由指针。指向的所以“+”号重载起来只会影响效率,所以我们要使用insert或者erase的时候需要先找到要插。1.关于push_back,push_front,和对应迭代器的使用。入的地方或者删除的元素才可以顺利插入。这些就是对应的需要掌握的并且基础的。4.关于reverse和sort。要注意的与insert相同。
2023-08-20 18:21:12 597
原创 string类
rfind:这里是从后向前找,与find的查找方向刚好相反。对应的maxsize不同的编译器与系统,对应的值都不同。在使用迭代器调用函数时,上述这种情况会发现类型不匹配。用find查找一个网站的协议,域名,资源名。上图是vs2013的maxsize。上述就是getline的作用。
2023-07-14 21:35:31 266
原创 linux环境基础
在使用静态库进行静态链接的时候,会将自己的方法拷贝到目标程序中,该程序以后不在依赖静态库。动态库不能缺失,一旦对应的动态库缺失,影响的不止一个程序,可能更多程序都无法正常运行。可重定位的目标文件,不可以独立执行,虽然已经是二进制了,需要经过链接才能执行。如果要按照静态库的链接方式,进行形成可执行程序,需要添加-static选项。在liunx系统中,编译形成可执行程序,默认采用的是动态链接,提供动态库。3.yum安装(最长用到的安装)—解决安装源,安装版本,安装依赖。(n)x:对光标字符之后的进行删除。
2023-07-12 18:24:10 219
原创 string
rfind:这里是从后向前找,与find的查找方向刚好相反。对应的maxsize不同的编译器与系统,对应的值都不同。在使用迭代器调用函数时,上述这种情况会发现类型不匹配。用find查找一个网站的协议,域名,资源名。上图是vs2013的maxsize。编译器会自己进行调用,不用管。
2023-06-04 11:09:13 524
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人