![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
文章平均质量分 60
JCGKS
这个作者很懒,什么都没留下…
展开
-
散列表、散列函数、散列冲突、哈希算法
当装载因子达到阈值之后,只申请新空间不进行数据迁移的操作,当有新的数据要插入的时候,将新数据插入到新的散列表中,并且从老的散列表中拿出一部分数据放入到新的散列表中。比如,我们可以从图片的二进制码串开头取100个字节,从中间取100个字节,从最后再取100个字节,然后将这300个字节放到一块,通过哈希算法(比如MD5),得到一个哈希字符串,用它作为图片的唯一标识。举一个极端的例子,如果散列表当前大小为1GB,想要扩容为原来的两倍大小,那就需要对1GB的数据重新计算哈希值,并且从原来的散列表迁移到新的散列表。原创 2024-03-08 09:25:21 · 690 阅读 · 0 评论 -
灵神笔记(1)----动态规划篇
本篇文章主要是观看"灵茶山艾府"动态规划篇视频后,做出的笔记。视频链接如下[动态规划入门:从记忆化搜索到递推][0-1背包,完全背包][最长公共子序列,编辑距离]原创 2024-03-06 14:36:31 · 864 阅读 · 0 评论 -
栈、队列专题
上一篇文章提到过,栈和队列都是操作受限的线性表。栈只允许在线性表的一端进行删除和增加操作,另外一端是封闭的状态。就像是一摞叠在一起的盘子,放的时候只能从下往上一个一个放;取的时候,从上往下一个一个取;既不能从中间放也不能从中间抽取;像这种"先进后出,后进先出"的结构就是栈。队列与栈一样都是操作受到限制的线性表,队列是一种"先进先出,后进后出"的结构,就像是排队买糕点,先来的人先买到后来的人后买到。入队的时候从队尾进入,出队的时候从队头出去。下图把"队列和栈"放在一起对比。原创 2024-01-19 22:28:48 · 871 阅读 · 0 评论 -
数组、链表专题
文章目录线性表数组为什么数组从0开始编号而不是从1开始数组VS容器算法题二分查找移除元素有序数组的平方长度最小的子数组螺旋矩阵链表链表结构单链表循环链表双向链表双向循环链表链表代码编写的小技巧理解指针或引用的含义警惕指针丢失和内存泄露利用哨兵简化实现难度重点留意边界条件处理算法题两个有序链表的合并移除链表元素反转链表两两交换链表中的结点删除链表的倒数第N个结点回文链表环形链表||数组VS链表Go--fmt.Scan VS fmt.Scanf线性表定义如下:线性表是指零个或者多个数据元素的有限序列;原创 2024-01-12 14:39:08 · 1003 阅读 · 0 评论 -
代码随想录训练营第六十天|84.柱状图中最大的矩形
找出当前柱子左边第一个小于该柱子高度的下标存储到minleftindex,找出右边第一个小于该柱子高度的下标存储到minrightindex。如果当前栈空或者当前元素大于等于栈顶元素,该元素进栈。否则先处理并出栈在进栈。原创 2023-07-09 20:44:58 · 114 阅读 · 0 评论 -
代码随想录训练营第五十九天|503.下一个更大元素||、42.接雨水
既然可以循环的利用数组中的元素寻找下一个更大的元素,故将nums数组扩展为原来的二倍,后一半的元素重复前一半的元素。剩下的和”下一个更大的温度“一样。原创 2023-07-08 20:13:40 · 238 阅读 · 0 评论 -
代码随想录训练营第五十八天|739.每日温度、496.下一个更大元素
由于要求的是比当天温度高的天数,所以在存储温度的同时还要存储温度所对应的下标也就是所谓的天数;由于要求的是更高的温度,于是当栈空或者当前温度小于等于栈顶温度时,该温度以及对应的下标进栈;反之,将栈顶元素出栈直到当前温度小于等于栈顶温度(这里使用的while循环)。每次出栈时要进行的操作:当前温度对应的下标-栈顶温度对应的下标就是ans[st.top().second]的值。首先将nums1映射到哈希表中,遍历nums2的元素,依次入栈。反之出栈直到当前元素小于等于栈顶元素,之后入栈当前元素。原创 2023-07-06 10:36:41 · 179 阅读 · 0 评论 -
代码随想录训练营第五十七天|647.回文子串、516.最长回文子序列
bool。原创 2023-07-05 10:33:50 · 59 阅读 · 0 评论 -
代码随想录训练营第五十六天|583.两个字符串的删除操作、72.编辑距离
【代码】代码随想录训练营第五十六天|583.两个字符串的删除操作、72.编辑距离。原创 2023-07-04 15:18:16 · 93 阅读 · 0 评论 -
代码随想录训练营第五十五天|392.判断子序列、115.不同的子序列
是等效的类型,它们都表示无符号的64位整数。它们的使用方式和功能都是相同的。是一种常见的简化写法,通常在代码中使用。它是通过包含适当的头文件(如。,都可以进行位运算、数值计算等操作,表示无符号的64位整数。时,需要包含该头文件,并在变量声明中明确地使用。是一个正式的类型,它在C++标准库的头文件。原创 2023-07-03 16:35:08 · 49 阅读 · 0 评论 -
代码随想录训练营第五十三天|1143.最长公共子序列、1035.不相交的线、53.最大自序和
与“718.最长重复子数组”相比,不同之处在于“text1[i]!=text2[j]”情况下的处理方式。对于“718.最长重复子数组”来说,“text1[i]!=text2[j]”情况下不需要做任何处理;但是对于本题来说,“text1[i]!=text2[j]”情况下“dp[i][j] = max(dp[i-1][j],dp[i][j-1])”因为子序列是可以不连续的,是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。原创 2023-07-02 09:34:56 · 94 阅读 · 0 评论 -
代码随想录训练营第五十二天|300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组
子序列:子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。原创 2023-07-01 13:30:34 · 186 阅读 · 0 评论 -
代码随想录训练营第五十一天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
第i天有三种状态:1>冷冻期2>持有股票3>不持有股票int。原创 2023-06-30 23:32:41 · 40 阅读 · 0 评论 -
代码随想录训练营第五十天|123.买卖股票的最佳时机|||、188.买卖股票的最佳时机Ⅳ
最多只能进行一笔交易,第i天总共有三种状态:1>不做任何操作2>持有该股票3>不持有该股票。不持有股票的前提是持有股票。int。原创 2023-06-30 22:30:31 · 75 阅读 · 0 评论 -
代码随想录训练营第四十八天|198.打家劫舍、213.打家劫舍||、337.打家劫舍|||
链接:LeetCode198.打家劫舍动态规划五部曲。原创 2023-06-28 21:05:18 · 99 阅读 · 0 评论 -
代码随想录训练营第四十九天|121买卖股票的最佳时机、122买卖股票的最佳时机||
题目中“只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票”的意思是说,只能拥有一只股票,在某一天拥有,在不同的一天卖出。原创 2023-06-27 15:05:53 · 96 阅读 · 0 评论 -
代码随想录训练营第四十六天|139.单词拆分
背包就是字符串s,可以选取的物品就是wordDict中的字符串。本题要判断的就是字符串s是否可以由wordDict中的单词组成。原因是错误代码在使用物品apple的时候,还没有使用到pen导致dp[8]为0,也就导致最后的dp[13]=0,也再一次验证这是一个排列的问题。对比两版的dp数组可以发现不同之处在于正确代码dp[8]=1,而错误代码的dp[8]=0。以"s='applepenapple’举例"分析代码,打印dp数组。还是以"s=applepenapple"为例,打印dp数组。原创 2023-06-26 20:08:32 · 152 阅读 · 0 评论 -
代码随想录训练营第四十五天|70.爬楼梯、322.零钱兑换、279.完全平方数
首先回顾一下动态规划的解法把本题抽象成完全背包问题。背包体积为n,物品重量为1或者2,物品价值为1.原创 2023-06-24 11:35:00 · 101 阅读 · 0 评论 -
代码随想录训练营第四十四天|完全背包、518.零钱兑换||、377.组合总和Ⅳ
完全背包有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值为value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。完全背包和01背包唯一不同的地方就是,每种物品有无限件。01背包和完全背包唯一不同的地方就是体现在遍历顺序上,接下来直接针对遍历顺序进行分析。在完全背包中,对于一维dp数组来说,两个for循环嵌套顺序是无所谓的。因为dp[j] 是根据下标j之前对应的dp[j]计算出来的。原创 2023-06-23 15:21:20 · 112 阅读 · 0 评论 -
代码随想录训练营第四十二天|01背包、416.分割等和子集
背包问题分类。原创 2023-06-22 21:36:50 · 349 阅读 · 0 评论 -
代码随想录训练营第四十三天|1049.最后一块石头的重量||、494.目标和、474.一和零
把该题抽象成01背包问题:可以得出,要想剩余的最后一块石头的重量最小,尽量每次选中的两个石头的重量相差不大,最好相等。首先计算所有石头的重量总和抽象成01背包问题:背包体积为sum/2(体积偏小的一半),物品重量为stones[i],物品价值为stones[i].原创 2023-06-22 23:36:18 · 34 阅读 · 0 评论 -
代码随想录训练营第四十一天|343.整数拆分、96.不同的二叉搜索树
【代码】代码随想录训练营第四十一天|343.整数拆分、96.不同的二叉搜索树。原创 2023-06-21 19:09:29 · 196 阅读 · 0 评论 -
代码随想录训练营第三十九天|62.不同路径、63.不同路径||
int。原创 2023-06-17 10:59:13 · 290 阅读 · 0 评论 -
代码随想录训练营第三十八天|509.斐波那契数列、70.爬楼梯、746.使用最小花费爬楼梯
动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。动归五部曲。原创 2023-06-17 10:39:36 · 1202 阅读 · 0 评论 -
代码随想录训练营第三十七天|738.单调递增的数字、968.监控二叉树
为了方便遍历每一位上的数字,将所给数字转变为字符串。从头到尾遍历该字符串或者从尾到头遍历该字符串都是可以的。本解法采用的是从尾到头遍历该字符串。本题要求的是找出最大的满足条件的数字。9是所有单位数字中最大的值,所以每当遇到str[i]>str[i+1]时,就先将str[i]减一,之后将i之后(不包括i)位置的数字变成‘9’。最后将字符串转变为整数。原创 2023-06-15 14:58:42 · 203 阅读 · 0 评论 -
代码随想录训练营第三十六天|435.无重叠区间、763.划分字母区间、56.合并区间
题目要求同一字母最多出现在一个片段中,如何把同一个字母圈在同一个区间里呢?在遍历的过程中相当于要找每一个字母的边界,如果找到之前遍历过所有字母的最远边界,说明这个边界就是分割点。原创 2023-06-14 13:32:02 · 40 阅读 · 0 评论 -
代码随想录训练营第三十四天|1005.K次取反后最大化的数组和、134.加油站、135.分发糖果
i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0,i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。情况二:rest[i]=gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过。情况三:如果累加的最小值是负数,汽车就要从非0节点出发,从后向前看,看哪个节点能把这个负数填平,哪个节点就是出发节点。原创 2023-06-14 11:35:58 · 37 阅读 · 0 评论 -
代码随想录训练营第三十二天|122.买卖股票的最佳时机||、55.跳跃游戏、45.跳跃游戏||
题目中说“最多时候只能持有一股股票。可以先购买然后在同一天出售”。当天购买当天出售赚取的利润为0。贪心的策略:若第二天售出的价格大于前一天买入的价格,那么就在第一天购入第二天卖出(最多只能持有一只股票)。举个例子:第一天买入第二天卖出赚取1元,第二天买入第三天卖出赚取1元。相当于第一天买入第三天卖出赚取利润2元。原创 2023-06-13 19:59:59 · 42 阅读 · 0 评论 -
代码随想录训练营第三十五天|860.柠檬水找零、406.根据身高建队列、452.用最少数量的箭引爆气球
用哈希表存储“钱的数值与个数之间的关系”。将5元和10元存储在哈希表中,20元不需要存储,因为不需要用20元给其它找零。原创 2023-06-13 15:06:39 · 77 阅读 · 1 评论 -
代码随想录训练营第三十一天|455.分发饼干、376.摆动序列、53.最大子序和
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。难点就是通过局部最优推出全局最优。原创 2023-06-11 20:27:35 · 34 阅读 · 0 评论 -
代码随想录训练营第三十天|332.重新安排、51.N皇后、37.解数独
所以选用第二个数据结构unordered_map<string,map<string,int>>targets作为本题的数据结构,可以使用”航班次数“这个字段的数字做相应的增减,标记到达机场是否使用过了。isvaild函数中的两个for循环,第一个是为了检验45度斜线上是否有两个及两个以上棋子,第一个是为了检验135度斜线上是否有两个及两个以上棋子。这道题的另外一种做法就是,先将满足条件的集合求出来,然后根据该集合设置对应的字符串,最后得出结果。下一个航班的起始机场就是,上一趟航班的末尾机场。原创 2023-06-11 16:01:27 · 48 阅读 · 0 评论 -
代码随想录训练营第二十八天|93.复原IP地址、78.子集、90.子集||
代码中需要注意的地方:1.递归终止的边界,需要同时满足两个条件“st == s.size()、point ==4”其中st表示子字符串的起始位置,point表示字符串中点‘.’的个数。“s.pop_back()”的意思是去除满足条件的字符串中的最后一个’.';2.有关string的一些操作。insert函数。原创 2023-06-11 10:35:43 · 27 阅读 · 0 评论 -
代码随想录训练营第二十七天|39.组合总和、40.组合总和||、131.分割回文串
写的第一版代码为这版代码的错误之处在于“总是吃回头草”,也就是在选完索引为4的数值之后,下一次可能会选取索引为2的数值,会造成结果的重复。这版代码运行之后,发现同样的组合出现的次数不止一次,用实际的例子去模拟的时候发现,由于这一行代码的存在 “backtracking(candidates,target,sum+candidates[i],i+1);”,会选择当前元素的下一个元素,for循环的存在也会导致可以选择当前元素的下一个元素,这样就出现了重复。正确版的代码就是把这一行去掉。原创 2023-06-10 17:43:05 · 46 阅读 · 0 评论 -
代码随想录训练营第二十九天|491.递增子序列、46.全排列、47.全排列II
本题求的就是自增子序列,所以不能对原数组进行排序,那也就不能采用先排序后去重的方式进行去重了。本题的去重关键“同一个父节点下的同层上使用过的元素不能再次使用”,可以在每一层设置一个辅助集合,将使用过的数值加入到该集合中,防止被二次使用。由于nums中数值的范围在[-100,100]之间,可以使用数组来代替集合。原创 2023-06-07 17:56:51 · 44 阅读 · 0 评论 -
代码随想录训练营第二十五天|216.组合总和III、17.电话号码的字母组合
容易出错的位置“递归终止条件”。写第一版代码的时候是这样写的这样写是错误的,当满足了“res.size()==k”但是"sum!=n"的时候,就会一直往下递归,sum会一直往下加,会造成溢出,res.size()也不再等于k;原创 2023-06-03 08:27:22 · 45 阅读 · 0 评论 -
代码随想录训练营第二十四天|回溯理论基础、77.组合
回溯的本质是穷举,穷举所有可能,然后选出想要的答案,如果想让回溯高效一些,可以加一些剪枝的操作。原创 2023-06-02 10:32:30 · 46 阅读 · 0 评论 -
代码随想录训练营第二十三天|669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
不能仅仅只能遇到不满条件的节点就返回nullptr,因为不满足条件节点的左右子树中可能有满足条件的节点。可以“不删除不满足条件的节点”,而是寻找“满足条件的节点”原创 2023-06-02 09:35:55 · 31 阅读 · 0 评论 -
代码随想录训练营第二十二天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
思路:利用上一题“236.二叉树的最近公共祖先”的解题思路,本题依然寻找p,q出现的位置,但是由于二叉搜索树的中序遍历有序性可使用二分查找法进行寻找。原创 2023-05-31 20:05:03 · 39 阅读 · 0 评论 -
代码随想录训练营第二十一天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先
思路:利用二叉搜索树中序遍历的有序性。进行中序遍历的同时,记录前一个节点,并计算前一个节点和当前节点的差值,并选择出最小的差值。原创 2023-05-30 14:38:39 · 39 阅读 · 0 评论 -
代码随想录训练营第二十天|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
思路:从头到尾遍历给定的数组,找出其中最大的元素所在的下标index.依据最大的数值建立节点。按照index,将区间一分为二进行递归。原创 2023-05-29 16:36:10 · 25 阅读 · 0 评论