- 博客(76)
- 收藏
- 关注
原创 机试准备最后一天
不使用i时,dp[i][j] = dp[i-1][j],使用i时,dp[i][j] = dp[i-1][j-val[i]] +1,两者取最小,若当前钱币价值大于j时,无法使用,dp[i][j]=dp[i-1][j]。dp[0][j]代表用钱币0凑成价值j的钱币数量,只有j==value[0]时,dp[0][j]=1,其他情况均为0。不放物品i时,dp[i][j] = dp[i-1][j],放物品i时,dp[i][j] = dp[i-1][j-weight[i]] + value[i]。,打表法的经典案例。
2025-03-19 20:33:55
429
原创 机试准备第19天
下面学习01背包问题,首先明确dp数组的含义,dp[i][j]代表下标为0~i之间的物品,任取然后放进容量为j的背包里。不放物品i,dp[i][j] = dp[i-1][j],放物品i,dp[i][j] = dp[i-1][j-weight[i]] + value[i]。dp[i][j]表示0~i-1 0~j-1的子序列的最长公共长度,若当前遍历元素相同,则dp[i][j]=dp[i-1][j-1]+1,若不同,则dp[i][j]=max(dp[i][j-1], dp[i-1][j])。
2025-03-18 22:29:30
379
原创 机试准备第18天
今天开始学习图论经典算法-最小生成树。给一个无向带权图,找到连通所有点且权值最小的子图。有prim算法与kruskal算法,只需要掌握kruskal算法,适用于稀疏图。首先将所有的边按权排序,按权从小到大的顺序加入子图,如果边的两点已经连通,则不加入。直到边数=顶点数减一即可退出。用于解决从一个顶点到其他所有顶点的带权路径。取出一个点作为当前节点,更新当前节点的邻居到起点的距离,找到离起点最近的点,将其更新为当前节点。简单的kruskal算法应用。马上要复试了兄弟们,加油加油。,怎么这么爱英文题。
2025-03-17 22:17:21
225
原创 机试准备第17天
常见考点有图相关的数据结构——邻接表法,图的遍历 BFS DFS 并查集,单源最短路径迪杰斯特拉。图由顶点和边构成,度用来说明该顶点邻接边的数量情况。下面是最简单的一个邻接表。对于不相交的集合,做find,根据元素找到所在的集合,Union对多个集合进行合并。Find(x,y),x找到祖先,y找到祖先判断祖先是否相同。树的构建容易变成一个链表,采取压缩路径的方法,下面是一个简单的并查集。首先树不存在入度大于2的节点,已连通的uv不应当有新边在加入,同时输入完成后应当是一个连通图,边数 = 顶点数减1。
2025-03-16 22:12:38
211
原创 机试准备第16天
搜索问题一般较为复杂,状态空间很大,使用规划过的遍历/枚举,不重复或不遗漏的找到解决问题。深度优先遍历是一条路走到黑,实现DFS就是从大问题到小问题,知道最小问题,用递归或分治法实现。对代码进行剪枝,去掉不必要的搜索过程,尽快找到最优解,提前终止搜索。可以排序arr,先执行加入arr[pos],再执行不加入。取巧的方法:如果解的数量有限,而且算解的时间很长。可以先写一个比较差的算法先生成所有的解,保存所有的解,写入代码,访问时直接访问解集合即可。兄弟们轻易别跨考,要补的东西太多了,博主现在天天都在焦虑。
2025-03-13 22:36:46
263
原创 机试准备第15天
优先队列每次出最大的,优先队列的底层由二叉堆实现。二叉堆是一棵完全二叉树,可以顺序存储。大根堆满足根大于左孩子且根大于右孩子。支持pop出队列中的最大值,push入队,top获取对首,就是最大值。想实现小根堆,可以修改<运算符的含义(用于自定义类),或者取相反数(用于int等)。BST满足左子树<根<右子树,中序序列是有序序列。双指针法即给出待插入的节点位置以及其父亲节点位置。首先维护一个小根堆,选出最小的两个,wpl加上最小的两个值,合并后插回小根堆。
2025-03-12 22:40:46
233
原创 机试准备第14天
链式存储的树节点,包含数据域与指针域,指针域分为left与right,指向左右孩子。2.再来新的数据,若数据不是“#”,创建树节点,获取对首,出队,根据对首做插入。广度优先即层序遍历,利用队列辅助遍历,深底优先需要借助递归机制,有先序(根左右),中序(左根右),后序(左右根)之分。使用分治法,首先扫描序列,然后读取字符,想要构建树,先设置根,设置左子树,设置右子树。已知先序,先找到根,拿根找中序,分解原来的先序与中序,递归处理。先构建树,在找节点到根的路径,找交点,距离求和。,好兄弟给的一道题,一遍过了。
2025-03-11 22:19:46
355
原创 机试准备第13天
显然,这是一个复杂到没法全盘考虑的问题,只能考虑逐渐降低复杂度。把一个大问题分解为相似的小问题,看看能不能解决小问题。使用分治法的两个要素:1.大问题要变成相似的小问题 2.找到最小问题的解决方案。若一个问题可以通过分而治之的思想解决,那就会用到递归。在代码段调用函数时,PC会走到被调函数的入口,栈区会压入一个新的栈针,返回时PC会回到主调方,栈区会弹出栈顶。这个是真看不懂,看了答案代码,首先得到n的二进制形式,找到对应二进制位不为0的位置,输出不为0的位置,然后将不为0的位置再次递归直到到递归边界。
2025-03-09 22:39:11
226
原创 机试准备第12天
写了半天代码逻辑不对,气完了。从左向右扫描表达式,遇到操作数就加入操作数栈,扫描到运算符,若运算符栈为空,则直接压入运算符栈,若运算符栈不为空但当前运算符优先级大于栈顶运算符,也执行压栈操作。队列支持push(),进入队尾,pop()出队,队头出队,front()获取队首元素,back()获取队尾元素,empty()判断队列是否为空。下面学习栈,后进先出。stack支持push()入站,pop()出栈,top()获取栈顶元素,栈只支持获取栈顶元素,empty()获取栈是否为空。,简单模拟。
2025-03-08 22:21:56
230
原创 机试准备第11天
字符串函数总结:substr(beginpos, len),insert(beginpos, string),erase(size_t pos = 0, size_t n = npos),erase(iterator first, iterator last),find(const string &s, int pos=0)在 string 字符串中 , 从 pos 索引位置 ( 包括该位置索引自身 ) 开始查找 string 类型字符串 s 在当前字符串的位置 , 如果没有查到就返回 -1。
2025-03-07 22:16:44
214
原创 机试准备第10天
使用map优化二分查找,把所有查找的数据放入map中,用map的键查找值,基于红黑树的map性能较好,但是会占用空间,如果map的时间性能依然不能满足,则选择unordered_map优化时间,unordered_map基于哈希查找,代价是更多的额外空间。下面进行字符串的学习,C风格的字符串不能支持赋值(=),比较大小(><),和判断相等(==),因此在使用方面有麻烦。,本题亮点在于使用map<char, vector<int>> map1,用vector作为键值对中的值,记录各个字符出现的下标位置。
2025-03-06 22:28:02
238
原创 机试准备第9天
下面进行排序的学习。使用C++中的sort函数,sort可以对数组,vector排序,也可以自定义排序规则,自定义函数cmp本质上是确定交换的规则。不太好想到从百位,十位,个位来拆解。照葫芦画瓢,主要是cmp函数要找到不需要交换的情况,即返回true的情况。,要用新的类来定义,学会对特殊类的结构进行排序。,感觉这道题好简单啊,牛客上给的困难。,定义一个结构体,拿拿的下。
2025-03-05 21:46:53
160
原创 机试准备第8天
首先了解非线性数据结构集合set,分为有序不重复set,有序可重复multiset,无序不重复unordered_set,无序可重复unordered_multiset。总的来说有序省内存,无序省时间。,有点难度,难点如何得到所有阶乘的所有自由组合,首先引入一个中间变量middle,将已得到的阶乘组合加当前当前遍历的元素得到的值记录下来再加入结果集合allsum。解锁map高级用法,使用string中的substr(起始下标,长度)得到字串,以string类型为键,int为值,利用迭代器遍历map。
2025-03-04 22:49:16
206
原创 机试准备第7天
vector初试化想要访问数组下标的时候一定要提前分配内存,如vector<int> vec(N),若不分配就用push_back。下面进入动态数组vector的学习与使用,从增删查改4个角度理解vector,学习迭代器iterator用法。然后学习list用法,与vector完全一样。,拿下。,简单。
2025-03-03 22:19:14
215
原创 机试准备第六天
数量关系好难找啊。发现思路不对,可以定义一个旋转函数,依次转90度,看哪个可以对上,而且我的思路不对,应该把原矩阵的空格信息去掉。调了半天把代码调出来了。先来一道判断下一天的开胃小菜。,我的方法不太好,答案是一天一天加,加n天。,又全是英文,看不懂啊。,就是上一题反着写,写的有点丑陋。,还是一个日期一个日期加。答案思路是很清晰的。
2025-03-02 22:16:34
231
原创 机试准备第五天
进入字符串处理环节,初始化内存越大越好,记得‘\0'终止符,有以下初始化办法。,首先用数学规律模拟一下,注意打印每一行字符之前要把字符数组清空。,对字符串的读入与处理有要求,'\0'表示字符串的结束。,使用一个标记项确认是否可以买,房价用double。还有一种二维数组的写法,本质上跟第一种思路没区别。从里到外找到每一层的4个顶点,确定层数。,最简单的一集,一次a出来了。,注意取模,防止溢出。
2025-03-01 21:53:25
224
原创 机试准备第三天
初试过线了兄弟们,机试正式提上日程,寒假太摆了,主要是没料到过线。,使用一个判断函数一个一个查就行。,主要卡在输入输出与约数判断上。,一道简单的模拟题,没啥难度。今天就这样,明天继续。
2025-02-26 21:51:42
261
原创 机试准备第二天
思路与上题相同,跳出循环时需要单独处理三种情况:1.边长为奇数的正方形矩阵;2.列数为奇数的最中间一列;3.行数为奇数的最中间一行,以上情况用ifelse处理,其余便利过程与上一题相同。,初次接触滑动窗口,先调节窗口末端即符合要求的子数组的最后一位,再依次缩小窗口初始位置从而找到最小满足题意的子数组。从该题学到前缀和,用新数组p表示原数组的第一个加到对应位置的总和,主要注意一下程序的输入输出。掌握每次处理的不变原则,如左闭右开或左开右闭,在每次处理是对个对角元素应采取相同的处理方式。
2025-01-19 22:07:20
283
原创 机试准备第一天
方法二使用双指针法,fast指针指示新数组元素,slow指针指示新数组元素对应下标,每遍历到一个非val元素,更新一次slow。,第一种解法是纯纯的暴力解,找到第一个大于等于target的数组下标。复杂度不满足要求,但是能通过。第二种是利用二分法,若target在数组中,则直接返回下标,若不在数组中,则返回right+1。第二种方法是双指针法,考虑到平方数的最大值一定位于数组的两侧,用i,j指示数组的两侧。,题目不难,主要注意二分法的区间划分有两种情况:左闭右闭与左闭右开。,可以先平方再排序。
2025-01-09 21:01:21
349
原创 深度学习第三弹:python入门与线性表示代码
1.熟悉基础数据结构——整型数据,浮点型数据,列表,字典,字符串;了解列表及字典的切片,插入,删除操作。通过以上操作我们就得到了用于训练的X,Y以及w和b的真实值。按步长为batchsize访问数据。确定学习率lr与初始参数w_0,b_0,注意w_0与b_0的维度。2.了解python中类的定义与操作,下面是一个简单的例子。使用随机梯度下降(SGD)方法更新参数,3.了解矩阵与张量的基本操作。二:简单的线性表示代码。定义训练轮次与训练函数。一、python入门。
2025-01-08 20:06:39
504
2
原创 深度学习入门
初识深度学习,了解深度学习的任务:找到x y 的对应f()关系,步骤为首先定义一个函数模型,然后定义一个损失函数,根据损失函数优化模型。利用梯度下降方法进行优化。
2025-01-01 10:19:49
96
原创 通关代码随想录!!!
60天的坚持,52篇博客,142道力扣题,自己还是做到了😄 遥想从1月刷到现在已经过去两个月,令人感慨,确实就像一句话说的那样:没有比脚更长的路,没有比人更高的山。朋友们,想做就行动吧。抒情环节完毕,下面回顾刷题内容:从基础的数据结构,数组、链表、哈希表、字符串,到高级一些的数据结构如栈、队列、树。之后就是最后一章单调栈,略微遗憾的是单调栈的有些题目一刷的时候确实迷迷糊糊过去了,没太搞明白,二刷再战。很难说自己短短两个月的时间就脱胎换骨,从小白变成大佬,不怕慢就怕站,慢慢走,最后会到终点的。
2024-03-14 15:22:39
882
1
原创 代码随想录刷题第60天
和接雨水遥相呼应的一道题,我们需要找到当前遍历数字左右两边第一个小于当前数字的值,通过保证单调栈中数字为递减顺序,来达到这一效果。此时栈顶元素,栈中下一元素与即将进栈元素构成了我们要求最大面积矩形的高度与宽度,其他逻辑与接雨水大致相同!最后一题是柱状图中最大的矩形。
2024-03-14 15:02:20
618
原创 代码随想录刷题第59天
通过单调栈确定左边和右边第一个比当前元素大或者小的元素值,若遍历发现当前元素值大于栈顶元素值,说明凹槽出现,可以承接雨水了。当遍历发现元素值相同时,更新栈顶元素,本题和刷过的每日温度如出一撤,不过是搞点花样,把数组弄成循环遍历的了。学过数据结构的朋友都知道循环队列,用取模运算表示循环过程,套到这里就行了。说实话,接雨水这个确实没太搞懂,只能二刷的时候再体会一下了。第一题是下一个更大元素II。
2024-03-13 17:02:27
685
原创 代码随想录刷题第58天
本题需要给出该天之后第一次温度高于该天的日期是在几天后。我们可以设想这样一种数据结构:它能存放当前遍历元素之前日期的信息,若找到第一次比某天温度高的日期就立即进行处理,同时还能是数据结构中的元素保持有序,这种数据结构就是单调栈。我们在这个栈中存放单调递增的元素,当遍历发现当前元素大于栈顶元素,立即记录两者下标的差值并弹出栈顶元素,若小于,就加入栈中,再次向后遍历,我们就能找到距离该元素最近的满足要求的元素下标。用单调栈有点大炮打蚊子😄首先用map进行一个数值与下标的映射,方便快速找到各个元素的下标值。
2024-03-12 18:07:10
640
原创 代码随想录刷题第57天
值得注意的是,dp[i][j]状态与dp[i + 1][j - 1]的状态一致,对于i、j的遍历应该采取不同的顺序,i从大到小遍历,j从小到大遍历,这是与递推公式里状态转移的过程息息相关的。当s[i] == s[j] 时,内侧的最长回文子序列长度加2,dp[i][j] = dp[i+1][j - 1] + 2;= s[j]时,说明两字符不能同时加入回文子串,应当分开讨论,若不取s[i],dp[i][j] = dp[i + 1][j] ,若不取s[j],dp[i][j] = dp[i][j - 1]。
2024-03-11 16:31:44
786
原创 代码随想录刷题第55天
当两者不同时,需要删除操作,可以删除word1[i - 1],也可以删除word2[j - 1],也可以同时删除word1[i - 1]与word2[j - 1],dp[i][j]在dp[i - 1][j] + 1、dp[i][j - 1] + 1、dp[i - 1][j - 1]中取最小值,dp[i][j] = min(dp[i -1][j] + 1, dp[i][j -1] + 1, dp[i - 1][j - 1] + 2)。同理dp[i][0] = i。第一题是两个字符串的删除操作。
2024-03-10 19:06:23
539
原创 代码随想录刷题第54天
综上dp[i][j] = dp[i-1][j-1] + dp[i - 1][j]。= t[j - 1],说明此次并未出现新的匹配,dp[i][j]的状态与遍历i-1前相同,即dp[i][j] = dp[i - 1][j]。当发现str1[i - 1] == str2[j - 1]时,相同子序列长度加一,dp[i][j]=dp[i - 1][j - 1] + 1,当发现str1[i - 1]!dp[i][0],dp[0][j]表示字符串与空串的匹配情况,故dp[i][0],dp[0][j]均初始化为0。
2024-03-09 14:41:11
960
原创 代码随想录刷题第53天
上动规五步曲:dp[i]表示以nums[i]为结尾的最大子数组和,由于题目要求最大子数组连续,因此dp[i]的状态与dp[i - 1]息息相关,同时nums数组中正数负数都存在,当遍历到nums[i]时发现大于dp[i - 1] + nums[i],则说明dp[i -1]小于0,此时应舍弃dp[i -1]重新从nums[i]取得最大子数组和。= nums[j - 1]时,dp[i][j]状态取决于dp[i - 1][j] 与dp[i][j-1]当中的最大值,相当于各自将序列后退一个元素以避开不相同元素。
2024-03-08 19:37:18
613
原创 代码随想录刷题第52天
dp[i]的状态与i之前的每个状态都有关,由于递增子序列在数组中并不是连续存在的,所以我们要遍历i之前的每一个数,若发现nums[i]大于遍历到的数,则dp[i]等于以该数为结尾的最大递增子序列长度+1,即dp[i] = max(dp[i], dp[j] + 1)。3.初始化dp数组。当nums1[i - 1] == nums2[j - 1]时,dp[i][j] = dp[i - 1][j - 1] + 1。初始化dp[i][0],dp[j][0] 为0,两层for循环遍历数组1,2。
2024-03-07 21:15:55
560
原创 代码随想录刷题第51天
若第i天持有股票,可能前一天也持有股票,dp[i][1] = dp[i-1][1];也可能是第i-2天卖出股票,即第i-2天时不持有的状态,经历了一天的冷冻期,第i天重新买入股票,dp[i][1] = dp[i-2][0] - prices[i]。dp[0][1]对应第0天持有股票,即在第0天买入股票,dp[0][1] = -prices[0]。dp[1][1]表示第一天持有股票,则可能在第0天或第1天购入,dp[1][1] = max(dp[0][1], -prices[1])。从前向后遍历dp数组。
2024-03-06 17:57:13
698
原创 代码随想录刷题第50天
dp[0][3] 对应二次买入的操作,dp[0][3] = dp[0][1]。建立一个大小为prices.size() * 2k+1大小的二维dp数组,递推公式dp[i][j+1] = max(dp[i-1][j+1] , dp[i-1][j] - prices[i]);
2024-03-05 18:52:56
741
原创 代码随想录刷题第48天
若第i天持有股票,则也有两种情况:第i天前已持有股票,dp[i][0] = dp[i - 1][0];第i天时买入股票,dp[i][0] = - prices[i],dp[i][0]在两者中取最大值即可。第i天时卖出股票,dp[i][1] = prices[i] + dp[i - 1][0],dp[i][1]取两者之间的最大值。,该题中股票可以被多次买出卖出,对于上一题中的dp[i][0]而言,当是第i天买入股票时,dp[i][0] = dp[i - 1][1] - prices[i]。
2024-03-02 22:05:38
1333
原创 代码随想录刷题第47天
上动规五步曲:dp[i]为考虑包括i在内的前i个房间可以偷窃的最大金额数。对于第i个房间有偷与不偷两种状态,偷则dp[i] = dp[i - 2] + nums[i]。从题意中得到dp[0]=nums[0],dp[1]=max(dp[0] , dp[1])。返回该节点两种状态下能偷到的最大钱币数量,dp[0]是不偷该点时能得到的最大钱币数,dp[1]是偷该点时能得到的最大钱币数。第三题是打家劫舍III。
2024-03-01 19:35:57
732
原创 代码随想录刷题第46天
不妨将单词看作一个个物品,字符串看作需要装满的背包,由于能够重复使用字典中的单词,所以这是一道完全背包问题。dp[i]为true时表示长度为i的字符可以被字典中的单词拆分。当dp[j]为true时,遍历发现串[j, i]在字典中,则dp[i]一定为true。初始化dp[0]为true,其余dp数组值初始化为false。由于本题中字典单词的排列会影响字符串的组成,因此可视作求排列数,先遍历背包,再遍历物品。
2024-02-29 19:45:21
450
原创 代码随想录刷题第45天
取coins[i]时,dp[j] = dp[j - coins[i]] + 1;不取coins[i]时,dp[j] = dp[j],因此dp[j] = min(dp[j], dp[j - coins[i]] + 1)。进行动规五步曲的分析:dp[j]为爬到第j层的方法数量,即到达楼梯数量为j的楼顶共有dp[j]种方法。已知背包容量,装满背包的方法dp[j] += dp[j - nums[i]]。,稍加分析可以发现本题与零钱兑换完全一致,就是把1,4,9这些平方数视为零钱面额,代码稍作修改就能ac。
2024-02-28 16:02:55
720
原创 代码随想录刷题第44天
这道题中我们已知求出装满背包的方法数量对应的递推公式为 dp[j] += dp[j - nums[i]],将dp[0]初始化为1,其余dp值初始化为0,由于该题求出的方法都属于组合问题,即选取硬币的顺序不会对组合数量产生影响,所以采取先遍历物品后遍历背包的方法。,结构与上题基本相同,唯一不同在于遍历顺序,若是先遍历物品在遍历背包,则不同物品进入背包的顺序是确定的,故不能求出不同顺序的排列。,用无限个面额的硬币凑出结果,很典型的完全背包问题,直接上动规五步曲。第二题是零钱兑换II。第三题是组合总和IV。
2024-02-27 15:51:15
552
原创 代码随想录刷题第43天
没啥思路,直接上题解了。接下来按照动规五步曲进行分析,dp[j]表示容量为j的背包中可以装的最大重量为dp[j],对于第i块石头,可以取也可以不取,故dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]),初始化dp = 0,先遍历物品,再遍历背包即可。dp[i][j]可由去掉上一个字符串时dp[i - 0nums][j - 1nums]得出,即dp[i][j] = max(dp[i][j], dp[i - 0nums][j - 1nums] + 1)。
2024-02-26 20:49:54
714
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅