- 博客(111)
- 收藏
- 关注
原创 代码随想录总结
如果没有算法训练营,靠我自己的自制力,恐怕是会半途而废了,但跟着训练营的每日安排,每天的题量也不多,花一点精力就可以完成,打卡之后还会有很强烈的成就感,以促进接下来继续打卡,是一个正向循环的过程,坚持下来就会发现有很大的收获。二刷结束了,感觉对代码随想录中涉及的题目有了更加深刻的理解,对代码的熟悉度也更高了,但还是需要多刷题,并且多重复。
2023-09-27 03:23:52 218
原创 c++八股day4-进程和线程的区别
最主要的是上下文切换,包括CPU 寄存器、程序计数器、用户空间的信息、内核空间 pcb,如果是进程切换,所有的信息都需要切换;多个进程间的线程切换和进程切换是一样的;如果只是在一个进程中,多个线程之间切换,只需要切换CPU寄存器和程序寄存器(运行的相对应的信息),,进程有独立的虚拟地址空间,线程没有独立的地址空间,但有栈、PC、本地存储等独立空间。,进程的健壮性高(有独立的运行环境,一个进程崩溃,不会影响其他进程)其他方面的比较:并发性、内存、所属关系、健壮性等。所以进程切换效率低,线程切换效率高。
2023-09-25 02:10:16 228
原创 c++八股day3-c++什么时候生成默认拷贝构造函数
如果有一个对象释放,释放时会把堆上资源进行释放,把文件句柄进行清空,另一个对象是通过位拷贝(浅拷贝)得来的,会持有相同的堆上资源、文件句柄,那它对应的数据操作文件的时候就会发生异常,比如操作堆上数据会报错。编译器编译的时候生成,为什么要生成,因为不得不生成(为了避免出现一些问题)(因为会和c++语法冲突,编译器要维护语法一致,所以需要再某些情况下不得不生成)类B有默认的拷贝构造函数,所以再构造类A时为了能够调用类B的默认拷贝构造函数,A必须要构造一个拷贝构造函数。d.类继承自基类,基类中有虚函数。
2023-09-17 23:12:00 314
原创 c++八股day2-虚函数表和虚函数表指针的创建时机
一个类的不同的对象(需要考虑浅拷贝和深拷贝),通常虚函数表指针不同,为了让每个对象都有自己的虚函数表指针,尽量使用深拷贝,显示的拷贝构造或重载赋值运算符(浅拷贝会共享一个虚函数表指针,深拷贝使另一个对象也有自己的虚函数表指针);编译器编译的时候声生成的,(前提)编译的过程中发现virtual关键字修饰的函数(当然如果有继承且基类有virtual修饰的函数,那也有自己的虚函数表指针)虚函数表指针在堆区指向虚函数表的地址,函数地址的指针又指向具体代码段的位置,那么。虚函数表和虚函数表指针的创建时机。
2023-09-16 18:22:53 363
原创 c++八股文笔记day1
malloc分配出一个具体的空间地址的时候,实际上多给我们分配了16个字节:16+mem,malloc返回的是mem的首地址,使用free时会统一地左偏移16个字节,这16个字节存储了我们的分配的内存块的描述信息,这个描述信息又包含了后面memory的长度,所以free传一个void*的指针时,立刻知道应该释放多大的空间(因为会左移16个字节,这16个字节中会包含我们之前申请分配内存空间的大小)b.new返回的是对象类型的指针,malloc返回的是void*,之后还要进行类型转换。
2023-09-16 01:46:56 358
原创 代码随想录总结
如果没有算法训练营,靠我自己的自制力,恐怕是会半途而废了,但跟着训练营的每日安排,每天的题量也不多,花一点精力就可以完成,打卡之后还会有很强烈的成就感,以促进接下来继续打卡,是一个正向循环的过程,坚持下来就会发现有很大的收获。二刷结束了,感觉对代码随想录中涉及的题目有了更加深刻的理解,对代码的熟悉度也更高了,但还是需要多刷题,并且多重复。
2023-07-24 19:36:35 109
原创 代码随想录day59
可以用insert将两个数组拼接在一起,然后再用单调栈求解,最后再resize数组的大小即可,其中resize是O(1)的操作,用insert扩充数组是O(N)的操作,所以我们用取余的操作即可。暴力解法(双指针),按照列来计算,遍历每一列的时候,还要向两边寻找最高的列,所以时间复杂度是O(n^2),超时了。把每一个位置的左边最高高度记录在数组maxleft上,右边最高高度记录在数组maxright上。503.下一个更大元素II。单调栈的本质是空间换时间。理解的还不是很透彻。
2023-07-23 02:59:35 79
原创 代码随想录day58
求右边或左边第一个比当前元素大的元素,就要保持单调栈从栈口到栈底是单调递增的。496.下一个更大元素 I。好几个地方出错了,需要重复刷。
2023-07-23 01:38:53 68
原创 代码随想录day57
有个陷阱就是当i=j的时候,由递推公式dp[i][j]=dp[i+1][j-1]+2可以看出递推公式计算不到i和j相同时候的情况,所以要手动初始化一下dp[i][i],所以之后第二个for循环遍历的时候就是从i+1开始遍历的,不是从i开始,不然会越界。绝大多数动态规划dp数组的定义是看题目要求什么,我们就怎么定义,但本题如果这样定义,发现找不到递推关系,本题要定义成一个二维的bool类型的dp数组,表示区间[i,j]范围的子串是否是回文子串,如果是为true,否则为false。516.最长回文子序列。
2023-07-23 00:16:07 57
原创 代码随想录day56
一个字符串做插入字符操作,就等于另一个字符串做删除字符的操作,所以我们只用考虑删除字符的操作即可。583. 两个字符串的删除操作。
2023-07-22 23:18:00 138
原创 代码随想录day55
关键点还是明确dp数组的含义:dp[i][j]表示以i-1为结尾的s子序列中出现以j-1为结尾的t的个数。编辑距离的入门题目,只涉及到了删除元素,没有增加替换。115.不同的子序列。
2023-07-22 18:32:31 56
原创 代码随想录day53
dp[i][j]表示长度为[0,i-1]的字符串和长度为[0,j-1]的字符串的最长公共子序列的长度为dp[i][j]。dp[i]表示以nums[i]为结尾的i以内的最大子序和。其实就是上一道题套了个壳子。1143.最长公共子序列。1035.不相交的线。
2023-07-22 14:48:44 204
原创 代码随想录day52
dp[i]表示以nums[i]为结尾的最长递增子序列的长度,必须以nums[i]为结尾。如果连续递增,count++,否则count从1开始重新计数。dp[i]表示以下标i为结尾的最长连续递增序列的长度。674. 最长连续递增序列。300.最长递增子序列。718. 最长重复子数组。
2023-07-22 02:42:39 39
原创 代码随想录day51
和122唯一的区别在于卖出股票收获利润的时候,需要减去fee。309.最佳买卖股票时机含冷冻期。714.买卖股票的最佳时机含手续费。
2023-07-22 01:45:15 55
原创 代码随想录day50
一共5种状态:还没有操作、第一次持有、第一次不持有、第二次持有、第二次不持有。123.买卖股票的最佳时机III。188.买卖股票的最佳时机IV。
2023-07-22 00:37:03 45
原创 代码随想录day49
本题用暴力和贪心都可以ac,重点介绍用动态规划求解。dp[i][1]表示第i天不持有股票的最大金额。dp[i][0]表示第i天持有股票的最大金额。122.买卖股票的最佳时机II。121. 买卖股票的最佳时机。一只股票全程只能买卖一次。一只股票可以买卖多次。
2023-07-21 03:00:55 52
原创 代码随想录day48
个人认为解题的关键就在于明确dp数组的含义:dp[i]表示考虑下标i及以内的房屋,偷窃得到的最大的金额。(注意是考虑,不是一定要偷)明确了dp数组之后,关键点就是当前房屋,偷还是不偷。暴力递归的方法还有待掌握。213.打家劫舍II。337.打家劫舍III。
2023-07-21 02:38:27 48
原创 代码随想录day46
单词就是物品,字符串就是背包,就是问能不能把背包填满,又因为可以重复使用,所以是完全背包。同时本题求的是排列,所以先遍历背包,再遍历物品(物品就是用substr截取出的字符串)。因为要进行查找操作,所以先把字符串数组转换成set。
2023-07-09 00:26:24 121
原创 代码随想录day45
同一个数可以用多次,所以是完全背包,只关心相加等于n即可,不用考虑顺序,所以先遍历背包后遍历都可以。70. 爬楼梯 (进阶)主要是对特殊情况的处理。
2023-07-07 11:52:47 235
原创 代码随想录day44
注意题目中要求的是组合数(由示例看出)(装满背包有多少种方法),所以先遍历物品,再遍历背包,又因为能重复使用物品,所以是完全背包。dp[j]表示装满容量为j的背包有dp[j]种方法(组合数)。由示例可看出此题要求排列数,所以先遍历背包,再遍历物品,遍历背包时从前向后遍历,保证物品可以重复添加。完全背包先遍历背包还是先遍历物品都是可以的,但是如果求组合数和排列数就有讲究了。518. 零钱兑换 II。377. 组合总和 Ⅳ。
2023-07-07 01:02:33 118
原创 代码随想录day43
又有0又有1还问最大的物品数,三个变量,所以应该用二维dp数组来做,dp[i][j]代表i个0,j个1最多装dp[i][j]个物品。每个物品的重量就是i个0,j个1,题目中又说最多有m个0n个1,所以递推公式用max。dp数组的含义:dp[j]表示容量为j的背包所能放的最大重量是dp[j],注意先遍历物品再遍历背包。错因:忘了一种情况,如果abs(target)>abs(sum)的话,不可能有满足条件的表达式。主要是正数的组合为left,负数的组合为right,推导出left和target之间的关系。
2023-07-07 00:13:31 83
原创 代码随想录day39
本题和上题不同之处在于初始化和递推公式上,初始化的时候障碍及之后就是0,递推公式是只有在没有障碍的地方进行递推。63. 不同路径 II。
2023-07-04 03:42:46 155
原创 代码随想录day38
到达当前台阶只依赖于前两阶,只能由i-2跳两阶,从i-1跳一阶到达,所以dp[i]=dp[i-1]+dp[i-2]。也是同样先对n进行判断,防止操作空指针。错因:开始的时候要先判断一下,如果n<=1,就直接返回,不然之后初始化dp数组的时候会溢出。因为dp[i]只依赖于前两个元素,所以我们只需维护两个元素即可。同样,只需维护两个变量(本写法还不太熟练)(1)定义n+1大小的dp数组来做。dp[i]表示到达位置i的最小花费。746. 使用最小花费爬楼梯。509. 斐波那契数。
2023-07-04 03:24:59 59
原创 代码随想录day37
优先在叶子节点的父节点放摄像头,然后每隔两个节点放一个摄像头,因为叶子结点的数量相对于根节点的数量是指数级的,所以从低向上考虑,所以用后序遍历。先转成字符串,如果出现x>y,让x--,记录y的下标位置,最后从y的下标位置往后都赋值成9,最后再转回int。注意函数返回的是状态信息,不是最后的结果。738.单调递增的数字。
2023-06-29 03:14:07 128
原创 代码随想录day36
判断重叠区区间就要通过排序使区间尽可能挨在一起。按左边界从小到大进行排序,直接求重叠区间。本题关键在于记录每个字符出现的最远下标。435. 无重叠区间。763.划分字母区间。
2023-06-28 16:25:29 95
原创 代码随想录day35
和分发糖果切入点相同,这种有两个维度需要考虑的题目,就要先考虑一个维度,两个同时考虑一定会顾此失彼,本题我们先对身高进行排序,再根据k进行插入。错因:判断有无重叠应该是当前区间的左边界和上一个气球的右边界进行比较,所以是i-1。贪心思路就是尽可能让重叠区间的气球挨在一起(自定义一个排序函数)贪心的策略就是给20的时候优先找10和5,其次找三个5.452. 用最少数量的箭引爆气球。406.根据身高重建队列。
2023-06-28 01:42:54 60
原创 代码随想录day34
局部最优就是当前累加和小于0就以下一个站点为起始站点,全局最优就是找到一个站点能走一圈。这种需要考虑两边的题目,要先看一边,再考虑另一边,不然容易顾此失彼。错因:1、开始加的不是净增量2、没有单独算totalsum。本题主要是想到排序的时候要按绝对值大小排序。1005.K次取反后最大化的数组和。
2023-06-27 21:28:40 211
原创 代码随想录day32
本题如果纠结走几步会很复杂,我们只需考虑覆盖范围即可。局部最优就是每遍历到一个元素的时候尽可能的去增加覆盖范围,全局最优就是得到整个序列最大的覆盖范围,如果能覆盖最后一个下标,就返回true。prices[2]-prices[0]=(prices[1]-prices[0])+(prices[2]-prices[1]),利用这个性质,我们只收获每天的正利润,不断累加。122.买卖股票的最佳时机II。
2023-06-24 22:50:10 127
原创 代码随想录day31
思路:用大的饼干尽量去喂胃口大的小孩。当然也可以用小的饼干尽量去喂胃口小的饼干。局部最优就是如果当前累加和小于0,就从下一个数开始重新开始计数。详见卡哥讲解,要考虑的情况还是挺多的。
2023-06-23 16:58:35 76
原创 代码随想录day30
本题难点在于容器的选择和使用上,既要找到一个对数据进行排序的容器,而且还要容易增删元素,迭代器还不能失效。一个机场映射多个机场用unordered_map,让多个机场之间有序,就是用map、multimap或者multiset,如果用multiset的话,遍历的时候不能删除元素,一旦删除元素的话,迭代器就失效了,所以用map。每一行没有进行判断,因为在单层搜索的过程中,每一层递归,只会选for循环(也就是同一行)里的一个元素,所以不用去重了。注意是从数字1-9,不包含0.332.重新安排行程。
2023-06-22 21:40:50 83
原创 代码随想录day29
每个节点就是一个递归,本题中结果元素的数量至少有两个元素。本题用set来进行去重。自身不能重复取,用used数组来进行标记。错因:去重之前没有进行排序。
2023-06-21 15:18:35 36
原创 代码随想录day28
题目中说了有重复元素,但是最后返回的所有排列中又不能有重复的排列,所以就要进行去重,涉及去重就要用used数组来记录每个元素的使用情况。注意先收获结果再写终止条件。还是有很多细节需要注意。
2023-06-20 18:11:00 50
原创 代码随想录day27
本题树层深度不是固定的,只要相加等于target就可以收获结果,另外同一元素可以重复选取,所以startindex传入的是i,不是i+1.本题数组中有重复元素,但是又要求返回的结果不能有重复的组合,所以要进行去重,去重之前一定要对数组排序。startindex就是分割线,每次需要判断的区间是[startindex,i]。
2023-06-19 18:10:39 40
原创 代码随想录day24
回溯算法是一种纯暴力搜索算法,有些问题没办法嵌套很多层for循环,只能用回溯法来搜。回溯法可以解决的问题有:排列、组合、切割、子集、棋盘。用树形结构(n叉树)来具体化回溯法,树的宽度就是要处理的集合大小,树的深度(纵方向)就是递归的深度。递归的每一层就是一个for循环,每个节点就是一个for循环。
2023-06-16 14:59:05 41
原创 代码随想录day23
错因:while循环条件写错:1、开始写成了!cur,这是表示不存在的意思,cur!=NULL才是存在的意思2、开始写的cur&&!st.empty(),应该是或者的关系,只要不同时为空就循环,应该写cur||!如果数组长度为奇数就选取最中间的节点作为根节点,如果为偶数就选靠左的那个节点做根节点,然后创建根节点,递归构造左右子树。当遇到节点值小于low时,其左子树一定都不符合,只有右子树的节点有可能符合区间,遇到节点值大于high时,右子树一定都不符合,只有左子树有可能符合。669. 修剪二叉搜索树。
2023-06-15 15:18:06 34
原创 代码随想录day22
递归法,因为二叉搜索树,所以已经帮我们确定了递归的方向。本题不涉及前中后序,也没有对中间结点的处理逻辑。本题删除节点的逻辑在终止条件里,因为遇到要删除的节点了,我们就要进行删除。本题没有写释放内存的逻辑。1、是叶子结点(左右都为空)2、左不空右空3、左空右不空4、左右都不空。235. 二叉搜索树的最近公共祖先(也可以看成普通二叉树去做)二叉搜索树中插入节点都可以在叶子结点找到插入位置。701.二叉搜索树中的插入操作。450.删除二叉搜索树中的节点。
2023-06-14 13:49:54 34
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人