文章链接:24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II24.两两交换链表中的节点思路注意是交换节点,不只是值。该题直接模拟。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next;
文章链接:203.移除链表元素、707.设计链表、206.反转链表203.移除链表元素思路因为在链表操作中,对头节点的处理与其他节点的处理不同,所以头节点需要特殊处理。本文对链表的操作为设置一个虚拟头结点在进行删除操作。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * Li
文章链接:242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和242.有效的字母异位词思路可以定义一个数组(数组其实就是一个简单哈希表),来记录字符串s里字符出现的次数;在遍历字符串t的时候,减去出现过的字符;最后再遍历一次record,若有非零数,则说明原字符串不是字母异位词。代码class Solution { public: bool isAnagra
文章链接:209.长度最小的子数组、59.螺旋矩阵II、58. 区间和、44. 开发商购买土地209.长度最小的子数组思路:用滑动窗口的思路求解。所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。滑动窗口的的本质就是双指针,只有一个for循环用于遍历终止位置(j)。代码:class Solution { public: int minSubArrayLen(i
704.二分查找思路:该题我用的是“左闭右闭”的二分写法。对于该写法,需要注意的是记得更新left和right的时候要+或是-1(下面的相关代码处有标注)。代码:class Solution { public: int search(vector<int>& nums, int target) { int left = 0; int ri
在参加代码随想录的很久之前,我就听闻了卡哥的大名,也在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 :
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号