在参加代码随想录的很久之前,我就听闻了卡哥的大名,也在B站上看到了相关的视频,但由于自制力一直不行,所有总是坚持不下去,当时好像就只看到了数组,甚至于链表都没开始看,就已经放弃了。想着这个暑假不能荒废了,就狠下心报名了训练营。并在这个暑假完成了代码随想录的一刷,自我感觉对于算法与数据结构的理解上了一个新的档次,希望以后能在有空闲时间对代码随想录进行二刷甚至于三刷。卡哥的代码随想录对于算法的讲解非常
文章链接:Floyd 算法精讲、A * 算法精讲 (A star算法)、最短路算法总结、图论总结题目链接:97. 小明逛公园、126. 骑士的攻击Floyd 算法精讲B站视频讲解:【图-最短路径-Floyd(弗洛伊德)算法】https://www.bilibili.com/video/BV19k4y1Q7Gj?vd_source=65a224d3f97ae5a1002c0964faf8a876思路
文章链接:Bellman_ford 队列优化算法(又名SPFA)、bellman_ford之判断负权回路、bellman_ford之单源有限最短路题目链接:94. 城市间货物运输 I、95. 城市间货物运输 II、96. 城市间货物运输 IIIBellman_ford 队列优化算法(又名SPFA)优化思路:只需要对上一次松弛的时候更新过的节点作为出发节点所连接的边进行松弛就够了。B站视频讲解:【最
文章链接:dijkstra(堆优化版)精讲、Bellman_ford 算法精讲题目链接:47. 参加科学大会、94. 城市间货物运输 Idijkstra(堆优化版)精讲思路:其实思路依然是 dijkstra 三部曲:第一步,选源点到哪个节点近且该节点未被访问过;第二步,该最近节点被标记访问过;第三步,更新非访问节点到源点的距离(即更新minDist数组)。只不过之前是 通过遍历节点来遍历边,通过两
文章链接:拓扑排序精讲、dijkstra(朴素版)精讲题目链接:117. 软件构建、47. 参加科学大会拓扑排序精讲拓扑排序的定义:给出一个有向图,把这个有向图转成线性的排序就叫拓扑排序。(当然拓扑排序也要检测这个有向图 是否有环,即存在循环依赖的情况,因为这种情况是不能做线性排序的。所以拓扑排序也是图论中判断有向无环图的常用方法。)思路:第一步:找到入度为0 的节点,加入结果集;第二步:将该节点
文章链接:prim算法精讲、kruskal算法精讲题目链接:53. 寻宝最小生成树最小生成树是所有节点的最小连通子图, 即:以最小的成本(边的权值)将图中所有节点链接到一起。prim算法prim三部曲第一步,选距离生成树最近节点;第二步,最近节点加入生成树;第三步,更新非生成树节点到生成树的距离(即更新minDist数组)。动画演示见B站视频:【最小生成树(Kruskal(克鲁斯卡尔)和Prim(
文章链接:108. 冗余连接、109. 冗余连接II题目链接:108. 冗余连接、109. 冗余连接II108.冗余连接思路:从前向后遍历每一条边,边的两个节点如果不同根,就加入集合(即:同一个根节点)。如果同根,就直接输出,因为这两个节点已经连在一起了,再加入这条边一定就出现环了。#include <iostream> #include <vector> using na
文章链接:并查集理论基础、107. 寻找存在的路径题目链接:107. 寻找存在的路径并查集理论基础并查集可以解决的问题并查集常用来解决连通性问题,就是当我们需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集。并查集的两个功能:1.将两个元素添加到一个集合中;2.判断两个元素在不在同一个集合。原理与相关代码1.如何将两个元素添加到同一个集合中// 将v,u 这条边加入并查集 void j
文章链接:110. 字符串接龙、105.有向图的完全可达性、106. 岛屿的周长题目链接:110. 字符串接龙、105.有向图的完全可达性、106. 岛屿的周长110.字符串接龙思路:第一步:判断点与点之间的关系,如果两个字符只差一个字母,那就是有链接。第二步:求起点和终点的最短路径长度,即无向图求最短路。(广搜最为合适,广搜只要搜到了终点,那么一定是最短的路径)#include <iost
文章链接:101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿题目链接:101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿101.孤岛的总面积思路:只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重新遍历地图 统计此时还剩下的陆地就可以了。// DFS #include <iostream>
文章链接:99. 岛屿数量(深搜)、99. 岛屿数量(广搜)、100. 岛屿的最大面积题目链接:99. 岛屿数量、100. 岛屿的最大面积99.岛屿数量(深搜)思路:#include <iostream> #include <vector> using namespace std; int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; /
文章链接:图论理论基础、深搜理论基础、98. 所有可达路径、广搜理论基础题目链接:98. 所有可达路径图论理论基础幕布链接:https://www.mubu.com/doc/bGiESMLhfR深搜理论基础关键点:1.搜索方向,是认准一个方向搜,直到碰壁之后再换方向2.换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程。代码框架:// 递归函数的代码框架 void dfs(参数) {
文章链接:42. 接雨水、84. 柱状图中最大的矩形视频链接:42. 接雨水、84.柱状图中最大的矩形题目链接:42. 接雨水、84.柱状图中最大的矩形42.接雨水思路一(双指针):当前列雨水面积:min(左边柱子的最高高度,记录右边柱子的最高高度) - 当前柱子高度。当前位置左边的最高高度:是前一个位置的左边最高高度和本高度的最大值。class Solution { public: in
文章链接:739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II视频链接:739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II题目链接:739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II739.每日温度思路:问:为什么会想到用单调栈?什么时候用单调栈?答:通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置
文章链接:647. 回文子串、516.最长回文子序列、动态规划总结篇视频链接:647. 回文子串、516.最长回文子序列题目链接:647. 回文子串、516.最长回文子序列647.回文子串思路:1.确定dp数组的含义:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。2.确定递推公式:当s[i] == s[j] 时,才进行判断。情况
文章链接:115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇视频链接:115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离题目链接:115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离115.不同的子序列思路:1.确定dp数组的含义:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。2.递推公式:①s[
文章链接:1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列视频链接:1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列题目链接:1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列1143.最长公共子序列思路:与718.最长重复子数组的区别:不要求连续,但需要有相对顺序。1.dp[i][j]
文章链接:300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组视频链接:300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组题目链接:300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组300.最长递增子序列思路:1.dp数组的含义:dp[i]表示i之前包括i的 以nums[i]结尾 的最长递增子序列的长度
文章链接:188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费视频链接:188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费题目链接:188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费188.买卖股票的最佳时机IV思路:与123.买卖股票的最佳时机III
文章链接:121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III视频链接:121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III题目链接:121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III121.买卖股票的最佳时机思路:1.dp数组的含义:dp[i][0]表示持有股票时的最大
文章链接:198.打家劫舍、213.打家劫舍II、337.打家劫舍III 视频链接:198.打家劫舍、213.打家劫舍II、337.打家劫舍III 题目链接:198.打家劫舍、213.打家劫舍II、337.打家劫舍 III198.打家劫舍思路:1.dp数组的含义:走到下标 i 时,所能偷的最大金币。2.递推公式:偷:dp[i - 2] + nums[i]不偷:dp[i - 1]dp[i] = ma
文章链接:322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包、背包问题总结视频链接:322. 零钱兑换、279.完全平方数、139.单词拆分题目链接:322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包322.零钱兑换思路:1.确定dp数组含义:装满量为j的物品个数最小为dp[j];2.递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp
文章链接:完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)视频链接:完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ题目链接:完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)完全背包题目:有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(
文章链接:1049. 最后一块石头的重量 II、494. 目标和、474.一和零视频链接:1049. 最后一块石头的重量 II、494. 目标和、474.一和零题目链接:1049. 最后一块石头的重量 II、494.目标和、474.一和零1049.最后一块石头的重量 II思路:本题需要将数组分成重量和相近的两堆,以便于两堆相撞后得到的剩余重量最小。这样就将题目化解成了 01背包问题 。c
文章链接:二维背包问题、一维背包问题、416. 分割等和子集视频链接:二维背包问题、一维背包问题、416. 分割等和子集题目链接:背包问题、416. 分割等和子集背包问题理论基础背包问题分类:01 背包(二维)思路:1.dp[i][j]数组的含义:任取[0, i]的物品放入容量为 j 的背包里的最大价值;2.递推公式:①不放物品i:dp[i][j] = dp[i - 1][j]; ②放物品 i :
文章链接:62.不同路径、63. 不同路径 II视频链接:62.不同路径、63. 不同路径 II题目链接:62.不同路径、63. 不同路径 II62.不同路径思路:1.初始化:将第一行和第一列都初始化为1;让其余部分都可以通过递推公式推出;2.递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1];class Solution { public: int u
文章链接:理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯视频链接:理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯题目链接:509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯理论基础:思维导图幕布链接:https://www.mubu.com/doc/4s8JP0BAo8R题目大纲509.斐波那契数思路:递归五部曲:1.确定
文章链接:56. 合并区间、738.单调递增的数字视频链接:56. 合并区间、738.单调递增的数字题目链接:56. 合并区间、738.单调递增的数字56.合并区间思路:1.将区间根据左边界排序;2.将第一个区间放入结果集中,便于以后的合并;3.遍历到与结果集最后一个区间重叠的区间就更新右边界;3.遍历到与结果集最后一个区间不重叠的区间就直接放入结果集中。class Solution { publ
文章链接:452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间视频链接:452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间题目链接:452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间452.用最少数量的箭引爆气球思路:1.用 左边界 将全部数组从小到大排;2.更新覆盖范围的 最大左边界 和 最小右边界 ;3.若遍历到的气球
文章链接:134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列视频链接:134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列题目链接:134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列134.加油站思路:局部最优:到一个加油站 存的油 要比去下一个站点所 消耗的油 多
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号