代码随想录算法训练营
代码随想录算法训练营打卡
goldsheeppp
这个作者很懒,什么都没留下…
展开
-
代码随想录 数组:二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件。区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。要判断在去区间里是不是合法的,以[1,1]举例。原创 2023-11-28 10:12:30 · 410 阅读 · 0 评论 -
代码随想录 数组:移除元素
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。不要使用额外的数组空间,你必须仅使用。的元素,并返回移除后数组的新长度。运行时间为4ms,可以优化一下。将slow++的操作放入上一行。原创 2023-11-29 22:27:47 · 376 阅读 · 1 评论 -
代码随想录 数组:有序数组的平方
它有三个参数sort(begin, end, cmp),其中begin为指向待sort()的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的下一个位置的指针,cmp参数为排序准则,cmp参数可以不写,如果不写的话,默认从小到大进行排序。使用两个指针分别指向位置0和n-1,每次比较两个指针对应的数的平方大小,建立一个和nums长度相同的数组result,将每次比较后更大的平方数放入result数组的尾端,从后往前放。将数组中的所有元素平方后排序。组成的新数组,要求也按。原创 2023-12-01 11:18:46 · 379 阅读 · 1 评论 -
代码随想录 数组:长度最小的子数组
给定一个含有n个正整数的数组和一个正整数target找出该数组中满足其总和大于等于target的长度最小的,并返回其长度如果不存在符合条件的子数组,返回0。for循环里的j指向的是终止位置,最重要的思路是如何移动起始位置,当集合里的元素满足条件是,移动起始位置即可,原创 2023-12-19 09:50:51 · 398 阅读 · 1 评论 -
代码随想录算法训练营第一天| LeetCode704 二分查找、LeetCode27 移除元素、LeetCode34 在排序数组中查找元素的第一个和最后一个位置、LeetCode35 搜索插入位置
思路:暴力解法,找到数组中对应元素的所有位置,存入一个vector,然后返回vector的首尾元素。(没写出来,在leetcode上的代码报错没通过)看完题解后的思路:分别寻找左边界和右边界,分别分析三种情况,target与数组位置的关系。要想清楚左边界和右边界与返回值的位置关系。public://寻找左边界//左闭右闭else//寻找右边界//左闭右闭else//判断情况else。原创 2024-01-24 22:15:21 · 412 阅读 · 1 评论 -
代码随想录算法训练营第二天| LeetCode977 有序数组的平方、LeetCode209 长度最小的子数组、LeetCode59 螺旋矩阵
思路:先对数组中所有元素取平方,然后重新排序。(冒泡排序忘了怎么写了,直接调用的size)看完题解后思路:双指针法,首位指针对应的元素平方同时比较,将大的元素放入新的数组末端,移动指针。(左闭右闭)原创 2024-01-25 22:01:31 · 210 阅读 · 0 评论 -
代码随想录算法训练营第三天| LeetCode203 移除链表元素、LeetCode707 设计链表、LeetCode206 反转链表
思路:遍历链表,如果元素的下一个指针指向的元素等于target,则将指针指向下下个元素(移除元素)。因为之前做过这题,想到了虚拟头结点的方法。原创 2024-01-26 19:31:37 · 370 阅读 · 1 评论 -
代码随想录算法训练营第四天| LeetCode24 两两交换链表中的节点、LeetCode19 删除链表的倒数第 N 个结点、LeetCode160 相交链表、LeetCode142 环形链表II
思路:定义虚拟头结点,定义两个临时节点,用于中间操作,每次改变三个结点的链接关系,改变完之后,讲cur移动到第三个结点继续循环,当cur后不足两个结点时,停止循环,输出链表。原创 2024-01-27 20:14:11 · 198 阅读 · 0 评论 -
代码随想录算法训练营第六天| LeetCode242 有效的字母异位词、LeetCode349 两个数组的交集、LeetCode202 快乐数 、LeetCode1 两数之和
242.有效的字母异位词思路:利用哈希表,由于小写字母只有26位,定义一个26位的数组,首先判断字符串1中各个字母的数量,然后判断字符串2与数组中字母数量是否相同,如果相同就是字母异位词,如果不相同则不是。349. 两个数组的交集思路:利用set容器构造哈希表,先将数组1,放入哈希表,之后遍历数组2,查找哈希表中是否有和数组2中的元素相同的元素,如果有,储存到新的数组里,遍历结束后,返回新的数组。思路:利用vector容器构造哈希表,由于数组的范围是有限的,可以构造一个有限长的哈希表。原创 2024-01-29 22:42:30 · 326 阅读 · 0 评论 -
代码随想录算法训练营第七天| LeetCode454 四数相加II、LeetCode383 赎金信、LeetCode15 三数之和、LeetCode18 四数之和
454.四数相加II454.四数相加II思路:遍历前两个数组,将前两个数组的和制成哈希表,key值为前两个数组元素的和,value值为出现的次数。遍历后两两个数组,求后两个数组对应的0-(c+d),在构造的哈希表中寻找,如果能找的到,计数值加上对应的value值。遍历结束后返回计数值。383. 赎金信思路:将magazine中的字符利用数组存为哈希表,记录字符的个数,根据之前一道题的思路,小写字母有26位,构建一个int hash[26];原创 2024-01-30 19:30:55 · 231 阅读 · 1 评论 -
代码随想录算法训练营第八天| LeetCode344 反转字符串、LeetCode541 反转字符串II、卡码网54 替换数字、LeetCode151 翻转字符串里的单词、卡码网55.右旋转字符串
344.反转字符串344.反转字符串思路:利用双指针法,收尾交换。541. 反转字符串II思路:每操作2k个字符,操作一次,因此在循环中直接i+=2*k;在循环内部,判断剩余字符数与k的关系,只要大于等于k个,就翻转前k个字符,如果小于k个,就全部翻转。i+k比size小,说明最后剩余的元素在k~2k之间,如果比size大,说明最后剩余的小于k个,需要全部翻转。卡码网:54.替换数字。原创 2024-02-01 21:50:38 · 298 阅读 · 1 评论 -
代码随想录算法训练营第九天| LeetCode28 找出字符串中第一个匹配项的下标、LeetCode459 重复的子字符串
思路:首先定义文本串和模式串,需要在文本串中寻找是否包含模式串。利用KMP算法,先构造出模式串中的前缀表,前缀表的长度与模式串长度相同,对应字符的前缀表的数字,就是当前位置往前的字符串中(包含当前位置),有多大长度的相同前缀后缀。(前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串;后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。)构造完模式串的前缀表,可以与文本串进行匹配。当=字符串长度-1时,说明找到了字符串中第一个完整的匹配项,返回字符串中对应的第一个下标。459.重复的子字原创 2024-02-02 20:10:48 · 341 阅读 · 0 评论 -
代码随想录算法训练营第十天| LeetCode232 用栈实现队列、LeetCode225 用队列实现栈
思路:栈具有先进后出的特点,而队列具有先进先出的特点,因此需要用两个栈来实现队列的功能,分别为stackIn和stackOut,当往队列中添加元素时,直接向stackIn中添加元素,当需要队列输出元素时,由于需要输出的元素再stackIn的底部,因此将stackIn中的所有元素输出到stackOut中,此时stackOut最外侧的元素即为需要输出的元素,注意:当stackOut不为空时直接输出,如果stackOut为空,再将stackIn全部输入。原创 2024-02-03 16:41:08 · 224 阅读 · 1 评论 -
代码随想录算法训练营第十一天| LeetCode20 有效的括号、LeetCode1047 删除字符串中的所有相邻重复项、LeetCode150 逆波兰表达式
思路:利用栈的结构具备先进后出的特点,来判断是否有对应的括号,当输入(、{、[,的时候,向栈入存)、}、],当输入)、}、]时,如果栈顶的元素与之不相同,返回false,如果与之相同,则将栈顶的元素推出,如果字符串还没有遍历完,输入)、}、]时,栈就为空了,说明多了右括号,返回false。如果遍历完整个字符串后,栈为空,返回true。原创 2024-02-04 17:14:56 · 223 阅读 · 1 评论 -
代码随想录算法训练营第十三天|LeetCode239 滑动窗口最大值、LeetCode 347 前K个高频元素
思路:滑动窗口每移动一次,滑动窗口中去除第一个元素,后面加入一个元素,获得一次滑动窗口的最大值。因此我们自定义pop、push、getMaxvalue函数,将滑动窗口内的元素排列成单调队列。单调队列的头部一直是最大元素,当滑动窗口移动时,我们需要向单调队列中push元素,当我们push的元素比队列中的尾部元素大时,就把队列的尾部元素pop出去,然后再将元素push进去,因为我们只需要滑动窗口中最大的元素。原创 2024-02-06 00:09:30 · 342 阅读 · 1 评论 -
代码随想录算法训练营第十四天|LeetCode144 二叉树的前序遍历、LeetCode 145 二叉树的后序遍历、LeetCode95 二叉树的中序遍历
前序遍历:中左右后序遍历:左右中中序遍历:左中右。原创 2024-02-18 22:29:53 · 382 阅读 · 0 评论 -
代码随想录算法训练营第十五天|LeetCode102 二叉树的层序遍历、LeetCode226 翻转二叉树、LeetCode101 对称二叉树
思路:利用队列queue,像队列中放入每层的元素,并记录每层的元素个数,然后按每层元素的个数循环,将该层的元素逐个推出队列加入数组,然后再将此元素的左右子元素加入队列,直到此层结束。当队列为空时,说明所有元素都遍历过。原创 2024-02-20 21:58:43 · 279 阅读 · 0 评论 -
代码随想录算法训练营第十六天|LeetCode104 二叉树的最大深度、LeetCode559 n叉树的最大深度、LeetCode111 二叉树的最小深度、LeetCode222 完全二叉树的节点个数
思路:递归法:后序遍历,先确定递归函数的参数和返回类型,然后找到递归函数的终止条件,在确定单层递归的逻辑,左右中。注意深度和高度的关系。后序遍历的最大高度即为二叉树的最大深度。迭代法:利用层序遍历,每遍历一层,深度++,当队列清空时输出深度。原创 2024-02-20 23:42:39 · 214 阅读 · 0 评论 -
代码随想录算法训练营第十七天|LeetCode110 平衡二叉树、LeetCode257 二叉树的所有路径、LeetCode404左叶子之和
思路:判断二叉树是否平衡,主要判断二叉树左右节点的高度差是否大于1,如果大于1就不平衡。需要判断左右节点高度,因此是后序遍历。利用递归遍历,先判断递归函数的参数和返回类型,然后判断终止条件,当节点为空时,返回0(此时高度为0),然后写单侧递归的逻辑,如果左右节点的高度差大于-1,则返回-1,如果左右节点的高度有-1,则返回-1,如果,左右节点的高度差<1,返回左右节点的最大高度+1。原创 2024-02-21 22:48:18 · 256 阅读 · 0 评论 -
代码随想录算法训练营第十八天|LeetCode513 找树左下角的值、LeetCode112 路径总和、LeetCode113路径总和II、 LeetCode106、105 从遍历序列构造二叉树
思路:利用递归遍历,后序遍历的顺序(前中后序都可以,因为都是先左后右),当遍历到叶子节点时,记录深度,如果比之前记录的深度更深则更新深度,和最深的叶子节点的值,遍历所有结点后,返回值。原创 2024-02-22 23:17:25 · 173 阅读 · 0 评论 -
代码随想录算法训练营第十九天|LeetCode654 最大二叉树、617 合并二叉树、700 二叉搜索树中的搜索、98 验证二叉搜索树
思路:递归终止条件,如果数组大小为1,返回对应值的结点。在数组中找到最大值,以及对应的索引,将最大值赋予根节点的值。然后将数组以最大值对应索引,分割成两个子数组,左边的数组用来根节点左边结点的递归,右边同理。原创 2024-02-25 13:41:38 · 184 阅读 · 0 评论 -
代码随想录算法训练营第二十天|LeetCode530 二叉搜索树的最小绝对差、501 二叉搜索树的众数、236 二叉树的最近公共祖先
思路:跟上一题一样,利用双指针,定义一个pre指针,遍历二叉树,中序遍历(二叉搜索树是有序的,用中序遍历是递增),如果前一个节点与后一个结点的差值大于最小差,就替代,遍历结束后返回最小绝对差。原创 2024-02-25 15:23:17 · 135 阅读 · 0 评论 -
代码随想录算法训练营第二十二天|LeetCode235 二叉搜索树的最近公共祖先、701 二叉搜索树中的插入操作、450 删除二叉搜索树中的节点
思路:二叉搜索树的最近公共祖先,即为满足值在p、q之间的那个节点。原创 2024-02-25 16:54:16 · 385 阅读 · 0 评论 -
代码随想录算法训练营第二十三天|LeetCode669 修剪二叉搜索树、108 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树
思路:利用递归法,判断终止条件,如果root为NULL,直接返回NULL。如果root的值小于low,继续判断root的右节点是否在范围内。如果root的值大于high,继续判断root的左节点是否在范围内。左中右遍历。原创 2024-02-27 17:26:59 · 236 阅读 · 0 评论 -
代码随想录算法训练营第二十四天|LeetCode77 组合
思路:利用回溯,找到所有满足条件的组合,比如n=4,k=2,在搜索组合时,搜索到1,2后想要搜索1,3,就需要先把加入2的操作回溯,变回1,再去找3。循环可以进行剪枝操作,判断能够组成k个元素的最大i,这个条件与当前path中的元素个数也有关系,比如n=6,k=3,如果当前path中已经有一个元素了,那么i的最大可行值为n-(k-path.size())+1 = 5. i最大只能为5。i大于5,path也放不满,直接剪枝掉。原创 2024-02-28 22:29:17 · 197 阅读 · 0 评论 -
代码随想录算法训练营第二十五天|LeetCode216 组合总和III、LeetCode17 电话号码的字母组合
思路:类似于找二叉树中满足条件的路径,在1~9中,找到满足个数,且满足数组和的组合,利用回溯函数,终止条件,如果个数和组合和都满足条件,把path加入到result中。如果sum大于n,直接return,单层逻辑中,从startindex开始,循环,向path中加入数字,然后总和更新,再找下一个数字加入,然后回溯。注意剪枝,循环的范围可以缩小(根据path的大小,或者sum的大小)。原创 2024-02-29 23:19:40 · 218 阅读 · 0 评论 -
代码随想录算法训练营第二十六天|LeetCode39 组合总和、LeetCode40 组合总和II、LeetCode131 分割回文串
思路:candidates中的元素可以无重复备选取,因此回溯函数中下一层回溯时,回溯函数的参数i不+1。剪枝:需要排序,如果sum加上当前candidates值大于target,直接退出循环。原创 2024-03-01 22:37:09 · 179 阅读 · 0 评论 -
代码随想录算法训练营第二十七天|LeetCode93 复原IP地址、LeetCode78 子集、LeetCode90 子集II
思路:要建立一个判断子字符串是否合法的函数,判断多种不合法的情况。在回溯函数中,参数除了s,和startindex还需要一个pointNum来记录句点的数量,当句点的数量等于3时,判断最后一个子串是否合法,如果合法就将s输入到result中,本题都是在字符串s的基础上加句点,没有生成新的字符串。如果s的长度小于4或者大于12,直接return result,剪枝。原创 2024-03-03 12:08:08 · 265 阅读 · 0 评论 -
代码随想录算法训练营第二十九天|LeetCode491 递增子序列、LeetCode46 全排列、LeetCode47 全排列II
思路: 序列中至少有两个元素,才能加入到result中,所以在回溯函数中,先判断path的大小,大于1,就将path放入result。在单层逻辑中,如果path非空,且当前元素小于path的back直接continue。在循环前定义一个set放置当前层的元素,如果在循环中发现set之前存过当前元素,直接continue,因为接下来的path会与之前的重复。原创 2024-03-04 17:05:31 · 382 阅读 · 0 评论 -
代码随想录算法训练营第三十天|LeetCode322 重新安排行程、LeetCode51 N皇后、LeetCode37 解数独
思路:利用回溯,看懂了代码,但是难以写出来,直接粘了。原创 2024-03-04 22:02:21 · 233 阅读 · 0 评论 -
代码随想录算法训练营第三十一天|LeetCode455 分发饼干、LeetCode376 摆动序列、LeetCode53 最大子序列和
思路:可以考虑从大到小发放饼干,也可以考虑从小到大发放饼干。先考虑从小到大发放,先对胃和饼干进行sort。外层for循环遍历饼干,内部while判断饼干是否大于等于胃,如果大于胃就前移且结果+1,如果小于,就遍历下一个饼干。原创 2024-03-06 11:16:28 · 275 阅读 · 0 评论 -
代码随想录算法训练营第三十二天|LeetCode122 买卖股票的最佳时机II 、LeetCode55 跳跃游戏、LeetCode45 跳跃游戏II
思路:计算每天股票的盈利(后一天于前一天的差值),将所有盈利的和加在一起,就是最大值。原创 2024-03-06 16:07:52 · 184 阅读 · 0 评论 -
代码随想录算法训练营第三十三天|LeetCode1005 K次取反后最大化的数组和 、LeetCode134 加油站、LeetCode135 分发糖果
思路:先将数组排序,然后将数组从最小值开始向后取反,直至数组都为正。如果K小于数组中负数的个数,取反后直接求和。如果大于数组中负数的个数,将取反后全为正的数组再次排序,然后对最小的元素取反剩余次数,再对数组求和。原创 2024-03-06 18:02:04 · 122 阅读 · 0 评论 -
代码随想录算法训练营第三十四天|LeetCode860 柠檬水找零、LeetCode406 根据身高重建队列、LeetCode452 用最少数量的箭引爆气球
思路:只有5、10、20三种面额的纸币,因此每接收一种纸币对应的数量就++,当接收10的,5的数量就--,当接收20的,有限消耗10的纸币(贪心),因为10只能用于20找零,而5还可以用于10找零,当无法找零时,返回false。原创 2024-03-06 22:34:16 · 331 阅读 · 0 评论 -
代码随想录算法训练营第三十六天|LeetCode435 无重叠区间、LeetCode763 划分字母区间、LeetCode56 合并区间
思路:先按左坐标从小到大的顺序排列区间,判断当前区间与上一个区间是否重叠,如果重叠,计数++,将当前右坐标替换成,这两个区间最小的右坐标(默认删除右坐标长的那个区间,因为右坐标越大越可能对下一个区间重叠),依次判断。原创 2024-03-07 23:12:00 · 160 阅读 · 0 评论 -
代码随想录算法训练营第三十七天|LeetCode738 单调递增的数字、LeetCode968 监控二叉树
思路:要求一个数字从第一位往后的大小是单调递增的,先把数字转换成字符串,然后从后往前逐位遍历,如果当前位比前一位小,则前一位--,从当前位往后都应该为9,因此记下当前位置。原创 2024-03-08 11:07:23 · 151 阅读 · 0 评论 -
代码随想录算法训练营第三十八天|LeetCode509 斐波那契数、LeetCode70 爬楼梯、LeetCode 746 使用最小花费爬楼梯
思路:利用动态规划思想,首先确定dp数组以及下标i的含义,dp[i]为第i个斐波那契数组的值。确定递推公式dp[i] = dp[i-1]+dp[i-2];初始化dp数组,dp[0] = 0, dp[1] =1. 确定遍历顺序,从前往后。打印dp数组,用于debug。原创 2024-03-08 17:08:32 · 279 阅读 · 0 评论 -
代码随想录算法训练营第三十九天|LeetCode62 不同路径、LeetCode63 不同路径II
思路:确定dp数组及其下标含义,dp[i][j]代表到达i,j坐标的路径数。确定递推公式dp[i][j] = dp[i-1][j]+dp[i][j-1]。因为只能向右向下移动。初始化dp数组,dp数组的第一行第一列都为1,因为不能向上向左。遍历顺序,从左到右从上到下,因为移动方向。打印dp数组,用于debug。原创 2024-03-08 18:03:21 · 851 阅读 · 0 评论 -
代码随想录算法训练营第四十天|LeetCode343 整数拆分、LeetCode96 不同的二叉搜索树
思路:确定dp数组以及下标的含义 dp[i]代表 i可以被拆分后的最大乘积。确定递推公式,假如拆成连个数,dp[i] = j*(i-j),拆成两个数以上,dp[i]=j*dp[i-j],j的范围为1到i-1.dp[i]找到所有情况的最大值。初始化dp[2]=1。dp[1]=0。原创 2024-03-08 22:37:17 · 200 阅读 · 0 评论 -
代码随想录算法训练营第四十一天|卡码网46 携带研究材料、 LeetCode416 分割等和子集
思路:0-1背包问题。dp[i][j]表示向空间大小为j的背包里放0~i个物品的最大价值。递推公式dp[i][j] = max(dp[i-1][j],dp[i-1][j-space[i]]+value[i]),有两种情况,不放i进背包,放i进背包,放i进背包的话,背包至少为i空余处space[i]的位置。初始化dp数组,dp[i][0]=0,因为背包容量为0时,什么都放不进去,价值为0。当背包容量大于第一个物品的容量时价值为第一个物品的价值。原创 2024-03-09 12:23:16 · 241 阅读 · 0 评论