day 29 第八章 贪心算法 part03 134. 加油站 135. 分发糖果 860.柠檬水找零 406.根据身高重建队列 (补) 可以换一个思路,首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。每个加油站的剩余量rest[i]为gas[i] - cost[i]。
第八章 贪心算法 part02 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II 1005.K次取反后最大化的数组和 (补) 难点:1.遍历时注意i的初始值,应该从1开始,因为下标为零的已经被初始化,并且从零开始dp数组下标小于零会报错。2.当天的递推公式利用前一天的dp数组来推。
day 27 第八章 贪心算法 part01 455.分发饼干 376. 摆动序列 53. 最大子序和 (补) 然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。可以尝试使用贪心策略,先将饼干数组和小孩数组排序。
day 26 第七章 回溯算法 part04 491.递增子序列 46.全排列 47.全排列 II (补) 思路:利用回溯算法先dfs整个数组,然后选择符合条件的存入result之中。本体特殊点在于需要一个哈希表集合来存储同层已经被使用过的元素。难点:1.backtracking里面的的i + 1而不是++i;2.回溯算法里面的确定终止递归的条件。
day 24第七章 回溯算法part03 93.复原IP地址 78.子集 90.子集II 思路:利用分割子串的思想递归搜索字符串,比较新的地方在于递归结束条件和回溯时的代码。2.回溯算法只撤销最近的决策,所以startindex不变。难点:1.子函数里的变量什么时候加&
39期代码随想录算法训练营总结 这60天正如卡哥所说前面十几天每天都能跟上,不论是在规定时间还是后面花时间补,最后都能赶上,但是到了中期,我本人是在第24天开始在回溯算法那一章节开始搁置了,因为学校进入复习周,自己就在这次训练营里懈怠了,等到了期末周结束后放暑假了,我终于开始补了,记得一开始不的章节是动态规划,由于这个章节可能相对容易理解再加上本人热情高涨,那几天的效率和积极性都很高,后面到了图论从第5天开始后就没有完整的刷过,每天也是只完成了其中一道,可能因为太难了沉不下心去学。于我而言学算法算是其中之一。
day 62 第十一章:图论part11 Floyd 算法精讲 A * 算法精讲 (A star算法) 在这之前我们讲解过,dijkstra朴素版、dijkstra堆优化、Bellman算法、Bellman队列优化(SPFA) 都是单源最短路,即只能有一个起点。而本题是多源最短路,即 求多个起点到多个终点的多条最短路径。
day 61 第十一章:图论part10 Bellman_ford 队列优化算法(又名SPFA)bellman_ford之判断负权回路 bellman_ford之单源有限最短路 【代码】day 61 第十一章:图论part10 Bellman_ford 队列优化算法(又名SPFA)bellman_ford之判断负权回路 bellman_ford之单源有限最短路。
day 59 第十一章:图论part09 dijkstra(堆优化版)精讲 Bellman_ford 算法精讲(补) 但 n 很大,边 的数量 很小的时候(稀疏图),可以换成从边的角度来求最短路。当 n 很大,边 的数量 也很多的时候(稠密图),那么 上述解法没问题。这么在n 很大的时候,也有另一个思考维度,即:从边的数量出发。
day 58 第十一章:图论part08 拓扑排序精讲 dijkstra(朴素版)精讲(bu) 难点:1.拓扑排列运用了bfs的方法,因为过程中用到了queue,类似于按圈想外遍历。思路:利用拓扑排列按顺序将有向图转化为线性图result,并且输出出来。2.通过最后result数组的大小和n的比较可以判断出该有向图是否有环。
day 57 第十一章:图论part07 prim算法精讲(补) 难点:1.prim三部曲:1.确定距离最小生成树的节点:遍历每一个点的mindist[j]与minval进行比较,并记录下当前节点cur.2.将当前节点加入到最小生成树:istree[j] = true.3.更新非生成树节点到最小生成树的最小距离:mindist[j] = grid[cur][i].思路:本质是求最小生成树:以最小成本把所有节点连接在一起:利用prim三部曲,将每个节点到最小生成树的最小距离记录下来(mindist),最后再求mindist数组的加和。
第十一章:图论part06 108.冗余连接 109.冗余连接II (补) 思路:从前到后遍历边,如果当前两个点不在一个集合就使他们加入到一个集合,构成树,如果位于一个集合则输出他们,因为如果把他们加入就会形成环。
第十一章:图论part04 110.字符串接龙 105.有向图的完全可达性 106.岛屿的周长(补) 难点:1.哈希表集合和map的创建。集合:unordered_set strlist;2.哈希表的插入操作:visitedstr.insert(pair (beginstr,1));思路:将本题寻找附近的字符串等效于寻找四周的陆地,在此基础上要将字符串对应路径长度,最后输出长度即可。4.用bfs求最短路径,原因在于它是一圈一圈的遍历,当到达目标点时当前路径长一定是最短路径。3.哈希表map的含义:以string为结尾的路径长度int.
第十一章:图论part03 难点:1.本题做标记的方法是将边缘的陆地从1改成2(而不是利用visited进行标记),然后巧妙地利用一个双层for循环直接将孤岛改为海水,最后输出。难点:1.本题做标记不用再申请空间创建visited[][],而是直接将grid的值由1变成0,以此做上标记。思路:用bfs把边缘的陆地及其周边的陆地都变成海洋,并做上标记,然后继续用bfs把未标记的陆地的数量加起来。思路:用bfs将边缘的陆地由1变为2,然后再用一个双层for循环把数值为1的陆地变成0,把2换成1即可。bfs需要构建队列,以此遍历外圈的点。
day 51 第十一章:图论part02 99.岛屿数量 深搜 99.岛屿数量 广搜 100.岛屿的最大面积 思路:遇到一个没有遍历过的节点陆地,计数器就加一,然后标记该节点陆地所能遍历到的所有陆地。dfs函数:此题就一个递归终止条件所以不用写确定递归终止的条件,然后确定单层递归逻辑,分别向上右下左四个方向进行递归,符合条件的继续下一层递归。2.一般dfs里面有两个终止递归的地方,一个在确定递归终止条件里,一个在确定单层递归逻辑里,如果当前限制条件较少,这两个终止条件只能写一个,否则答案会错误。一圈一圈地遍历),然后将符合条件的节点压入队列中并标记,然后在弹出队列中的元素一圈一圈的遍历循环往复一直到队列为空。
day 50 深搜理论基础理论 98. 所有可达路径 思路:本题用深搜的方法来做,dfs的过程:把符合题目要求的所有情况加入到result的二维数组中,最后再转化为n个一维数组这样可加入空格并且按要求输出。主函数的过程:将题目给的无环图转化为邻接矩阵,然后将当前节点和目标节点传入dfs函数里面。难点:1.dfs函数里的三部曲中的确定当前层逻辑:首先遍历所有与当前点相连的点,加入到路径中,然后递归下一层,直到后面没有节点了最后系统会自动返回并尝试其他可能,此时你要解决它自动返回后的代码这个代码就是回溯。注意递归中的return不是回溯,而回溯往往在递归后面。
day 49 第十章 单调栈part02 42. 接雨水 84.柱状图中最大的矩形 4.在弹出栈顶元素后需要判断栈是否为空,而此时的栈顶元素对应的高度就是当前点的左侧高度值,然后利用公式求值:h = min(height[st.top()],height[i]) - mid,w = i - st.top() - 1,这里求的是距离所以要减一。思路:本题利用单调栈寻找任一一个元素右侧第一个比他大的元素的位置,而左侧我们用当前元素左侧的那个元素,从而形成一个凹槽(根据单调栈的性质,一定是一个凹槽,只不过宽度可能不是1),然后利用公式求出结果。难点:1.本题的公式是:res = h * w;
day 48 第十章 单调栈part01 739. 每日温度 49503.下一个更大元素II 6.下一个更大元素 I 2.遍历nums2数组,如果当前栈顶元素对应的值在nums1中,则进行下一步判断,如果当前元素对应的值大于栈顶元素如果当前元素对应的值大于栈顶元素对应的值的话,就进行计算距离等操作,注意最后在while循环结束之后才进行st.push(i)的操作。只有单调栈递增(从栈口到栈底顺序),就是求右边第一个比自己大的,单调栈递减的话,就是求右边第一个比自己小的。难点:1.栈中压入的是数组下标,如果当前元素对应的值小于等于栈顶元素对应的值,那么就将当前元素压入栈中,否则就求得距离并弹出栈顶元素同时压入当前元素。
day 47 第九章 动态规划part13 647. 回文子串 516.最长回文子序列 3.确定递推公式和遍历顺序时,先确定递推公式:根据画图可以退出dp[i][j]取决于i,j之间的长度和dp[i + 1][j - 1]的情况;难点:1.递推公式的推导:dp[i][j]可以由少一个元素的两种情况的最大值的得出;2.该题的关键在于dp[i][j]的定义:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,数据类型是bool类型。1.本题dp[i][j]的定义与上一题不同:上一题是bool这一题是int类型,表示长度。难点:1.本题dp[i][j]的定义。
day 45 第九章 动态规划part12 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离 思路:此题与判断子序列的区别在于本题有加和的操作,当s[i - 1] == t[j -1]时,有两种情况,第一是不使用当前元素匹配,第二是使用当前元素匹配;思路:本题与不同子序列的区别在于本题两个字符串都能删除,因此在word1[]和word2[]不相等时,有两种情况,而由于要得到最小值,所以取min.难点:1.初始化时dp[i][0]应该都是1,因为s的可以进行删除元素,可以进行删除组成一个空数组,同理dp[0][j]都是零。3.不理解的地方就像dp[i][j]的定义就能理解了。