- 博客(52)
- 收藏
- 关注
原创 【Python】面向对象编程
在对象的增删改查中,只有查询的权限是最高的,能够查到class。定义、通过类创建出一个对象、属性相关、方法相关、补充。类:对某一具体对象特征的抽象。作用:根据抽象的类,生产具体的对象。面向对象要做的就是:把行为划分到对象里面去。万物皆是对象,对象是具体物体。只能从class去改,而不能从对象上改class的属性。面向对象:对过程进行封装,调用对象的过程就好了。属性:只能通过对象来索引(访问)。类由名称,属性、行为来构成。对象可以抽象成类,类可以实例化为对象。变量:是可修改的变量,无宿主。
2024-06-17 23:44:30
461
原创 代码随想录二刷DAY1~3
没做出来,发现问题了,滑动的应当是右指针for()里面填,这样一来,sum的初始化应当放到for的外面。//这句初始化很重要,我们要让反转后的最后一个元素指向nullptr,那么head的pre自然应该初始化为nullptr。题面:在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留。//条件也重要呀,不用判它的next,手写模拟就知道了。这题有难度,要求重复的节点不保留,显然需要三指针了。// 如果是最长,一发现不符合,就扩。//如果是最长,一发现不符合,就扩。
2024-06-16 20:54:56
1196
原创 代码随想录算法训练营第36期 last day
那么应当:往i的左边找最矮在哪,往i的右边找最矮的在哪(这些都要高于或等于i)。若左右有矮于i的,就不往那边搜(因为这样搜到的结果必定小于等于其他矮柱子搜到的结果,画图就知道了)。单调栈:与“接雨水”不一样的是,这题最左边和最右边柱子都有相应的结果,在接雨水里不是这样。所以宽度不一定是1,宽度是动态变化的(根据栈的弹出。求右边的最大:如果当前自己的高度是最大的,那么自己就是最大height[i],;写的很好,我想不到用i j的距离(而不是索引字符)来做单字符与双字符的回文。别人的删,就相当于我的增。
2024-06-14 16:01:30
743
原创 代码随想录算法训练营第36期DAY58
写了两个for循环,运行时间竟然是最优的,击败100%,奇怪了。今天的主题是:编辑距离。在字符串进行增删字符的操作。显然如果是求连续子序列,就可以用KMP(记得。使用二维数组来记录字符比较结果。Dp[i][j] 相同长度。
2024-06-12 14:33:17
878
原创 英语口语练习方法
Start with daily conversation, 起床时问自己今天的计划,起床后第一件要做的事情是什么,我今天要去图书馆学习吗,我下午晚一点需要去买菜吗。给自己时间去作为辩论的正反方,准备出1分钟或3分钟的讲稿。构造句子时不要尝试用英文去思考(难以实现),可以是将中文的状语挪到最后,然后将这句话转成英文输出。这样的话,自己的中文语言习惯会暴露出来,根据ground truth来反馈修正。强化记忆:听播客,重复听直到能知道它下一句是什么,这样才能形成自然的英语反应。用夸张的语调来朗读。
2024-06-12 01:24:55
1301
原创 代码随想录算法训练营第36期DAY57
想起来了,是贪心算法,sum<0会减小后一位数字,因此continue;同时记录过程中的maxres.记得记录过程中的最大值,并且注意res的初值。分析法和上一题的图片一样。今天的好消息:能去华五。
2024-06-11 13:32:02
1003
1
原创 代码随想录算法训练营第36期DAY56
Dp[i]的定义:dp[i]表示i之前包括i的以nums[i]为结尾的最长递增子序列的长度。可以看出,后面的状态依赖于前面的状态:选了前面的3,就不会选出后面的2 3;注意模版中,对与最长问题,要在外部while去更新bestres;我的算法会找出0 1 3作为答案,而不是0 1 2 3。For()循环里也是<=size了,不然比较不完。记得最后返回的是res就行,而不是dp的末位。学完了,在纸上手动推导一下DP数组:已完成。没选前面的3,就能够选出后面的2 3.讲得很好,主要是要手写模拟一遍。
2024-06-10 17:01:38
2449
原创 代码随想录算法训练营第36期DAY53
注意初始化,不要初始化dp[1]=-fee;因为这样不如不买,(0元)。直接在for循环里求dp[1] 因为用不到刚开始dp[1]。3 状态4:冷冻期。注意冷冻期显然是无法卖股票的,因为手上没有股票。1 状态2:是继承的不持有。A.昨天为冷静期,前天卖出。滚动数组不好想,直接二维吧。2 状态3:今天卖出股票。0 状态1:持有股票。
2024-06-09 14:39:33
718
原创 代码随想录算法训练营第36期DAY52
初始化错了,应该是price[0] 而不是price[i],为什么呢:因为它是在第一天,用的第一天来初始化。//初始化错了,应该是price[0],为什么呢:因为它是在第一天,用的第一天来初始化。
2024-06-09 02:00:49
625
原创 代码随想录算法训练营第36期DAY51
和上一题不同的地方就是多了一个项:-price[i]不够了,要写成:dp[i-1][1]-price[i]算是比较系统的东西,记在纸质笔记本吧。算是二刷:来自力扣优质题解。时间竟然也快了很多,不知道为什么。每次记录更新最小点和最大出售值。做过贪心法:只要能赚钱就买卖。
2024-06-08 22:29:25
627
原创 代码随想录算法训练营第36期DAY50
能想到:后序遍历,把孩子信息传到父节点:若孩子之和没有大于父节点,则买入父节点。还要注意一些复杂的逻辑。状态dp表示抢或不抢,抢的话,就不能动两个孩子;不抢的话,就要考虑动孩子了。求一个节点,偷与不偷两个状态分别所得到的金钱,返回值是一个长度为2的数组。节点之间的状态影响进一步计算,那么是动态规划。那么情况2 3 就已经包括了情况1。记录当前偷与不偷得到的最大金额。写函数来解决,就不用挪数组。树形DP,在树上做状态转移。如果写累了就去写套磁信吧。注意,考虑不代表必选。//这个递归还挺难想。
2024-06-08 21:01:26
843
2
原创 代码随想录算法训练营第36期DAY49
回溯怎么做呢:拼接str,看能不能拼出来。注意每个单词能用多次,不是用了就没。自己的思路不好,题解思路:枚举所有分割字符串,判断是否在字典集中出现过。// 排列数,先背包容量再物品。
2024-06-08 16:57:38
795
1
原创 代码随想录算法训练营第36期DAY48
复习一遍:背包容量在外层循环,物品在内层循环,则为排序数;//要用本层已被覆盖的值,那么要跳过没覆盖的值 if。物品在外层循环,背包容量在内层循环,则为组合数。遍历顺序不一样时,需要注意dp里面的符号。//遍历背包,再物品。
2024-06-07 08:59:23
1077
原创 代码随想录算法训练营第36期DAY46
在闫氏DP法里学过:第i个物品选k个,纸质直至不能选,k从0开始取。完全背包问题,正向遍历背包容量,就能实现“多次取”晚些时候发新专栏,学习图神经网络。注意与 目标和 那题区分开。代码随想录的视频也看了。
2024-06-01 14:06:28
637
原创 代码随想录算法训练营第36期DAY45
据说和416分割等和子集很像,思考一下:分成了size()/2+size()%2个集合,集合内部的差要尽可能地小。之后就不会了,晕眩。之前的01背包:求的指定容量下的最大装载价值。Dp数组的含义:dp[i][j] 装满i个0,j个1,最多(max)装了多少个物品(dp[i][j])。三变量(物品个数[也就是子集的长度]、m个0,n个1)放入当前物品,有x个0,y个1;进一步:left-sum+left=target;所以:left=(target+sum)/2;,他归纳了同类型的题,当然得先思考再看题解。
2024-05-31 21:16:40
1070
1
原创 代码随想录算法训练营第36期DAY44
注意闫氏DP法的运用:在声明数组含义时候,需要明白每个下标的含义,然后再去denote DP数组的含义——满足**条件(每个下标)的**,再表示它的值。//从0开始检查:前i个物体,使得背包体积为0,合法吗:合法,因为可以都不选。//从0开始检查:前i个物体,使得背包体积为0,合法吗:合法,因为可以都不选。//这里因为只计算变的情况下对应的当前背包体积,所以是[j-v[i]]//所有只考虑前i个物品,**且总体积不超过j**的选法的集合。//所有只考虑前i个物品,**且总体积不超过j**的选法的集合。
2024-05-31 15:08:26
1384
1
原创 代码随想录算法训练营第36期DAY43
这句话很好:由于每个正整数对应的最大乘积取决于比它小的正整数对应的最大乘积,因此可以使用动态规划来求解。这样DP动机就很可信了。真正引出了卡特兰数,具体分析及推导见《A First Course in Discrete Mathematics》只要有进栈,就产生一个左括号;只要有出栈,就产生一个右括号。就是右括号数永远不超过左括号数。那么每阶段右括号数量不超过左括号数量。//i-1因为dp[0]没有意义。做完之后,完整地学习了卡特兰数。-1别超过1就行了。
2024-05-29 16:11:28
1144
1
原创 代码随想录算法训练营第36期DAY42
初始化:x轴和y轴,障碍物之后的格子都是0了。写for一旦obstacle就退出循环了,那么其他的就是保持初始值0. 还有:如果ob为1,那么就continue 不去计算它的dp(能保持加0)“有障碍的话,其实就是标记对应的dp table(dp数组)保持初始值(0)就可以了”这一点倒是做到了。不会做,卡在状态转移了:如果左边和上面都是0,显然是走不过来的,该怎么表示呢?想对了,但是还差一点点:思维、手写模拟(别懒)、语法(多练多写多想)//起点/终点有障碍 0;细节:从1开始循环。
2024-05-27 22:48:02
2009
原创 代码随想录算法训练营第36期DAY41
终于过了,卡在记录该位置是否已经走过,用unordered_set, unordered_map显然都不行。想复杂了,用二维数组bool就好了。厦大保研夏令营考过,练一练。前两题学习初始化方式就好vector<int> dp(N+1);还是写不出来,不知道该怎么利用偏移量去更新。还差闫氏分析法没学完。//撞墙或者走过了,不要漏了“走过”厦大保研夏令营考过,练一练。不会做了,实在想不出来。
2024-05-27 16:29:34
658
原创 代码随想录算法训练营第36期DAY39
但是由于减小了str[i]之后,可能不满足str[i-1]<=str[i]了,若发生了这种情况,一定是str[i-1]==str[i],此时就需要再str[i-1]-1,递归地会处理到某个位置idx,我们发现:str[idx]==str[idx+1]==...==str[i]。**接着判断是否有arr[i]>arr[i+1]**,如果是,那么idx位置数字减1,后面位置全部为9即可。我们要找到从高到低第一个满足str[i]>str[i+1]的位置,然后把str[i]-1,再把后面的位置都变成9即可。
2024-05-25 15:57:57
1177
原创 代码随想录算法训练营第36期DAY38
力扣数学描述:出自力扣官方题解:(https://leetcode.cn/u/leetcode-solution/)出自力扣博主:笨猪爆破组(https://leetcode.cn/u/xiao_ben_zhu/)遍历字符串,如果已扫描部分的所有字符,都只出现在已扫描的范围内,即可做切割。想切割,要有首尾两个指针,确定了结尾指针,就能确定下一个切割的开始指针。昨晚很快就想出来了,今天相当于二刷。
2024-05-24 23:17:16
654
原创 代码随想录算法训练营第36期DAY37
原因是,按照元素 1 进行降序排序,对于每个元素,在其之前的元素的个数,就是大于等于他的元素的数量,而按照第二个元素正向排序,我们希望 k 大的尽量在后面,减少插入操作的次数。渔(套路):一般这种数对,还涉及排序的,根据第一个元素正向排序,根据第二个元素反向排序,或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化解题过程。复习ACWING区间合并,学习记忆ACWING模版,力扣高赞题解,代码随想录题解、COZE的解法(主要还是要学会区间合并,COZE的解法并不能走天下)。
2024-05-24 00:15:54
1166
原创 代码随想录算法训练营第36期DAY36
0,i]一旦负数了,就从[i+1开始选起点。(家产败光了的意思——用光了留下当时的剩余,表明自己的都不够用,所以要换到下一个起点)。不会了:for遍历的就是起点,找起点就好了。//报错越界,为什么?注意限制条件的先后顺序,把nums.size()放在最前面,因为越界是不能的,所以首先判断。代码随想录的方法,正好复习一下重载比较符的写法。知道思想,代码还是写不出来。贪心好难,希望能坚持到柳暗花明那天。(看当下能不能走得动,能不能出发)//标记起点,total判定一圈油量。没问题了,只是会超时。
2024-05-23 00:17:15
1381
原创 代码随想录算法训练营第36期DAY35
首先对数组排序,然后使用二分查找来查找后面的元素中是否有和当前元素相同的元素,如果找到,就添加到结果中。当前覆盖范围用完,但是仍然没有覆盖到终点,就启动下一步覆盖范围(nextcover)很巧妙,也很难想到:计算每天的利润(今天卖出,昨天买入的利润),只取正数相加。注意要找到所有出现两次的整数,这样的整数可能不只有一个。把可选的(每次可选跳几步)复杂问题转化为覆盖单位问题(能覆盖到哪)。//排除空节点,避免空指针报错。还是不会呀,每天抽时间来复习做过的题吧。用最少的步数,尽可能覆盖最多的范围。
2024-05-21 23:41:32
999
原创 代码随想录算法训练营第36期DAY34
/son:N个操作,每个节点最多26个孩子;策略2:优先满足小胃口,内部指针应当是孩子,这一点很重要,与策略1不同。//用scanf()的话 因为会忽略空格和回车,那么用char数组是最合适的。策略2:优先满足胃口大的,那么内部指针应当是饼干。//初始时候每个元素是单独的一个集合,根是自己p[x]=x;:找到根节点之后,让寻找路径途径的所有节点直接指向根节点。//a的父节点变为b的根节点(b所属树的根,生孩子)//让父节点等于它的祖宗节点,注意语法和算法。//下标是0的点,既是根节点,又是空节点。
2024-05-21 00:54:24
1131
原创 代码随想录算法训练营第36期DAY32
/ n 为输入的棋盘大小// row 是当前递归到棋盘的第几行了void backtracking(int n, int row, vector<string>& chessboard) {// 遍历完没有返回false,说明找到了合适棋盘位置了}bool isValid(int row, int col, char val, vector<vector<char>>& board) {if (isValid(row, col, chessboard, n)) { // 验证合法就可以放。
2024-05-19 15:19:30
835
原创 代码随想录算法训练营第36期DAY31
/ path里已经收录的元素,直接跳过。// 记录这个元素在本层用过了,本层后面不能再用了。// used[i - 1] == false,说明同一树层nums[i - 1]使用过。// used[i - 1] == true,说明同一树枝nums[i - 1]使用过。// 使用set对本层元素进行去重。// 如果同一树层nums[i - 1]使用过则直接跳过。// 此时说明找到了一组。// 此时说明找到了一组。
2024-05-17 22:43:49
601
原创 代码随想录算法训练营第36期DAY30
与之前的回溯不同,子集问题的答案存在于树形结构的每一个节点当中。十分困难,有很多细节。加油吧,日拱一卒的前进,毕竟万事开头难。
2024-05-16 20:55:58
824
原创 代码随想录算法训练营第36期DAY29
记住used数组:记录同一分支上的是否用过。语言表述见代码随想录网站。记:回溯组合题,答案要在叶子节点上,这样来构造。
2024-05-16 00:47:53
602
原创 代码随想录算法训练营第36期DAY28
未剪枝,注意i=startindex开始:classSolutionprivatevectorvectorint>> result;vectorint> path;voidintk,intsum,inttargetsum,intififreturn;forinti<=9;i++)sum+=i;1sum-=i;return;publicvectorvectorint>>intk,intn) {
2024-05-14 21:50:20
432
原创 代码随想录算法训练营第36期DAY27
对i的上界做一个限制(“至多”)i<=n-(k-path.size())+1;为什么要+1:因为把startindex减去了,但是它也是可用的(作为起点),所以要加回来。(选择:本层集合中元素(树中节点孩子的数量就是集合的大小)){(路径,选择列表);
2024-05-13 15:44:34
539
原创 代码随想录算法训练营第36期DAY25
二分法mid=(left+right)/2可能会爆INT,写成mid=left+(right-left)/2【相当于:偶数取左边】;有序数组构造二叉树:从数组中间位置取值作为节点元素,就是平衡的了。根据数组构造二叉树,其本质是寻找分割点,然后递归左区间和右区间。
2024-05-11 21:09:55
547
原创 代码随想录算法训练营第36期DAY24
本题就是标准的搜索一条边的写法,遇到递归函数的返回值,如果不为空,立刻返回。找到插入的节点位置,直接让其父节点指向插入节点,结束递归,也是可以的。如果递归函数有返回值,如何区分要搜索一条边,还是搜索整个树?solution2:遇到空,声明新节点并返回,让东西接住他。solution1:用父节点去接住他(新val)不会写。自己都没看懂solution2就通过了,递归真神奇难懂。//递归函数里面有终止逻辑,这里不用单独接住他。对递归的理解更加深刻了。//递归边,所以要用变量接住他,带上if。
2024-05-10 17:14:35
912
原创 代码随想录算法训练营第36期DAY23
/重载运算符:注意有很多细节,不要漏了static。//记得把private的变量重新赋值或者清空。//自己就是答案或者空树。
2024-05-09 21:54:28
732
原创 代码随想录算法训练营第36期DAY22
自己做的时候忽略了:nums.length>=1的题给条件。所以每次递归都要判断是否size()>=1,不要空的。递归还是写不出来,早上看过答案也写不出来,逻辑理不清,什么时候该创建变量去接住递归的结果?递归没接住(没找到),就返回的是初始化的result=nullptr;这里要知道并利用这个性质:二叉搜索树的中序遍历序列是严格单调增的数组。迭代法就很容易出错。
2024-05-09 12:48:45
1130
原创 代码随想录算法训练营第36期DAY21
自己写的,过了(注意到层序遍历中,que队头存的是最左边的节点,再写一个getheight函数控制最大高度就好)。待会看解析,掌握迭代、递归。优化迭代法:不用找最大深度,直接记录每层的res,用i=0记录。While结束前的那层,就是最后一层。学会了手写,但是编程实现呢?
2024-05-07 21:43:26
665
原创 代码随想录算法训练营第36期DAY20
自己写的迭代法和递归都有问题,应该从:传入节点的树是否为平衡二叉树来考虑(大部分时候是subtree。没有想到用父节点来判断,作为核心逻辑。因为要知道孩子信息并且返回给父节点,那么用后序遍历。中左右,所以前序遍历。
2024-05-07 00:33:44
727
原创 代码随想录算法训练营第36期DAY19
(找叶子:要把孩子的信息返回给节点,所以用后序遍历)。根节点的高度就是二叉树的最大深度。//如果没找到满二叉树,就继续向左向右递归(后序遍历)+1表示中节点。:任意节点与根节点的距离(从1开始,也就是:根节点深度是1);写前序是比较麻烦的。记忆:深根(前序) 高叶(后序):任意节点到叶子节点的距离。根节点的高度就是最大深度。//叶子之下的,高度为0。
2024-05-05 15:33:53
1174
原创 代码随想录算法训练营第36期DAY18
):正常层序遍历,vector<vector<int>> result的每行,取最后一列,就是答案。本题依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了。Node的孩子不为空的时候,push_back就好,语法怎么写,尤其是这个children的迭代。判断是否遍历到单层的最后面的元素,如果是,就放进result数组里,随后返回result就可以了。“队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
2024-05-04 23:28:18
1396
原创 代码随想录算法训练营第36期DAY14
/那么最左孩子的头上:中节点怎么办呢?不用着急,下一次循环会处理,因为有!//根据先进后出的栈特点 以及,中序遍历的特点:访问顺序与输出顺序相反,来入栈。(自己是最左的,那么自己就没有左孩子了,自己就是中了)。//空结点不入栈,记住这里是要入栈,而不是单纯的更新cur。//空结点不入栈,记住这里是要入栈,而不是单纯的更新cur。这里都需要二刷,来检验和加深印象。//先获取,以便进行迭代。//先获取,以便进行迭代。
2024-05-01 01:01:57
2011
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人