自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 代码随想录算法训练营day49|单调栈

因为这题要求的是最近的比该元素大的元素,因此采用递增栈。当遍历到的元素比该元素大时,符合题意,这时应该比对栈顶元素和遍历到的元素的大小,若符合题意则将栈中元素弹出,直到栈里没有比遍历到的元素更小的元素为止,这时将遍历到的元素入栈。面试经典题,此题有双指针和单调栈两种解法,时间复杂度都是O(n),双指针法是竖着求每一列的雨水,比较好理解,单调栈是横着求每一行的雨水,比较难想到。这题和42接雨水很像,这题的思路是以当前遍历到的元素的值为矩形的高,查找下一个比当前遍历到的元素小的元素。84柱状图中的最大矩形。

2024-12-21 17:19:07 728

原创 代码随想录算法训练营day46|动态规划part12

同样定义二维dp数组,dp[i][j]表示以i为起点,j为终点中最长子串的长度,所以当s[i]==s[j]时,dp[i][j]=dp[i+1][j-1]+2;=s[j]时,dp[i][j]就取dp[i][j-1]和dp[i+1][j]的最大值。今天的两道题都很有难度,647回文子串的思路非常巧妙,因为用一维dp数组比较难表示子串的起点和终点,所以需要用二维dp数组表示,dp[i][j]表示以i为起点,j为终点的子串是不是回文子串,当s[i]和s[j]不同时,该子串不是回文子串;516.最长回文子序列。

2024-12-19 17:13:20 298

原创 代码随想录算法训练营day44、45|动态规划part11、part12

这类题目的共同特点就是dp[i][j]表示长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j],这样方便初始化操作。另外,在72编辑距离中很巧妙的一个思想就是逆向思维的运用,要想让两个字符串相同,让其中一个字符串增加一个字符可以看作是将另一个字符串减去一个字符。这道题的特点是不能将某个数跳过,所以第i个数只有两个状态:一是将前面的总和加上该数,二是舍弃前面的总和,以该数为起点,所以可以写出上面的状态转移方程。115.不同的子序列。

2024-12-18 20:04:43 219

原创 代码随想录算法训练营day43|动态规划part10

今天的是子序列问题,第二题难度不大,可以采用类似贪心的思路求解。第一题的思想比较新颖,注意dp[i]是以i为末尾元素的最长递增子序列,可以用两层循环,第二层循环遍历从0到i-1,通过不断更新dp[i]的值求解最长递增子序列,这里的思路很巧妙。另外,第一题还可以用贪心的方法,要使子序列尽可能长,就要使每个子序列中的数尽可能小,若遇到更小的数就将其替换。这行代码的意思是如果两个数列有数字相同,就在前面的基础上加1,因为两个数列是同步的。先处理完第一行,再处理后面的。第三题的思路和第一题类似,

2024-12-15 13:08:54 437 1

原创 代码随想录算法训练营day42|动态规划part9

接下来进行初始化,dp[0][0]的意思是在第0天持有股票时的现金,自然是0.接着dp[0][1],这里不能直接根据字面意思推断,是因为这里dp[0][1]本身没有意义,所以要根据状态转移方程推导出dp[0][1]=0,因为如果初始化为其它数值答案都不正确。卡哥的做法是分为四个状态,分别是持有股票,保持不持有股票的状态,卖出股票的状态以及冷冻期4个状态。这题非常巧妙的地方在于相较于前面两题,这题将保持不持有股票的状态和卖出股票的状态分开,这样有利于进行冷冻期的操作。但是卡哥的思路还是更为直观的。

2024-12-14 13:25:58 435

原创 代码随想录算法训练营day41|动态规划买卖股票问题

今天的三题买卖股票问题,实际上解题方法都大同小异,思路也和昨天的树形dp有相似之处,都是用一个dp数组的不同下标来记录不同的状态。其中第一题是只买卖一次,可以用贪心的方法,找出左边的最小值和右边的最大值,相减即可最大利润。第三题与第一题的区别在于买卖次数上限改为两次,不好用贪心。同时第二题也可以使用贪心,将每次买卖都拆解开,采用倒序遍历保证每一次的数值在计算前不会被覆盖。所以将正数部分累加即可得到最大值。

2024-12-12 20:45:05 386

原创 代码随想录算法训练营day39|动态规划part7

这题的状态转移方程和前面的题目的形式都不同,因为这题是在二叉树上进行的操作,又因为操作二叉树需要采用递归,所以这道题实际上是每一层都创建一个dp数组,所以这个dp数组只需记录每一层的状态再向上返回即可。今天是打家劫舍专题,第一题难度不大,想出状态转移方程dp[i]=max(dp[i-2]+nums[i],dp[i-1])即可求解;第二题相比于第一题,这题的房屋改成了环状结构,表面上看很难,实际上只需分类讨论,分成不包含头节点和不包含末节点两部分分别用第一题的思路求解,然后再取最大值即可。

2024-12-11 17:32:38 394

原创 代码随想录算法训练营day38|动态规划part6

前面几题思路较为简单,也与前几天的题目思路相似,在此不再赘述。139单词拆分这道题,应该将所给的字符串看作背包,将所给的字典序看作物品,所以这道题就可以转化为求解在所给的字符串中是否能用所给字典序将其填满。又因为在这题中,每个所给字符串的子序列都可以分割为更小的子序列直到不能再分割为止,所以只要某个子序列所分割后的两个子序列都能在所给字典序列中找到,那么这个子序列就满足题意。另外,关于这题是先遍历背包还是先遍历物品的问题,由于这题所给的字典序的顺序有要求,所以是排列问题,所以应该先遍历背包再遍历物品。

2024-12-10 22:37:39 323

原创 代码随想录算法训练营day37|动态规划part5

完全背包和01背包的不同点在于完全背包每个元素可以取多次,而01背包只能取1次,所以在dp一维数组遍历时,完全背包仍然要从前往后遍历,并且无论是先遍历物品还是先遍历背包都可以,但是先遍历物品和先遍历背包在次数上是有差别的,只是在求最大价值时得到的结果相同。先遍历物品时,一定是前面的物品遍历完之后再遍历后面的物品,所以这是组合;在先遍历背包时,是用一个背包容量将所有物品扫过一遍后才查找下一个背包容量,所以满足要求的填满背包的物品有不同的顺序,所以这是排列。518. 零钱兑换 II。70. 爬楼梯 (进阶)

2024-12-09 21:48:00 352

原创 代码随想录算法训练营day36|动态规划part4

接着设立dp数组,二维dp数组dp[i][j]表示在前i个数中总和为j的情况有dp[i][j]种,所以dp[0][0]表示在前0个数中总和为0的情况,所以dp[0][0]=0.再考虑递推公式,当j<num[i]时,dp[i][j]=dp[i-1][j];,当j>num[i]时,有取和不取num[i]的情况,因此dp[i][j]=dp[i-1][j]+dp[i-1][j-num[i]],这里取num[i]表示的时先空出物品i的容量,然后用前i-1个元素装满背包。这道题比较难理解,思路也很巧妙。

2024-12-07 18:03:03 746

原创 代码随想录算法训练营day35|01背包问题

这道题很巧妙的思路是将该题看作容量与价值相等的背包,并且将每个数字看作所占空间与价值相等的货物,这样只需判断背包中dp[target]==target即可得出答案,并且不用担心dp[target]>target的情况,因为在这种情况下,这个物品容量超出背包剩余容量,因此无法被加进背包。在二维背包中先遍历物品还是先遍历背包都是可以的,这是因为二维背包的结果是由上一层的左上方的正上方得到的,所以先遍历哪个都可以。一维背包与二维背包的不同点在于一维背包必须倒序遍历,而且必须先遍历物品再遍历背包。

2024-12-05 19:28:42 349

原创 代码随想录算法训练营day34|62不同路径 63不同路径|| 整数拆分 96不同的二叉搜索树

这道题也是一道比较经典的动态规划的题目,这题显然要用二维dp数组,dp数组的值表示当机器人走到当前位置时的所有不同路径数,dp[i][j]=dp[i-1][j]+dp[i][j-1],再考虑初始化的情况,因为最上面一行和最左边一列都只有一种走法,即一直向前走,所以将最上面一行和最左边一列都初始化为1;这道题只需在62不同路径的基础上略加改动即可,即将放有障碍的地方初始化为0,然后当障碍位于首行或首列时,将该位置及该位置之后的所有位置都初始化为0;96不同的二叉搜索树。

2024-12-05 19:02:05 410

原创 代码随想录算法训练营day32|动态规划part1

这题相对于前面两题比较难,主要是因为这题的初始化和公式没有直接给出,需要自己思考。但这题实际上和前面两题差别不大,需要自己定义一个数组,然后数组f(n)=f(n)=min(f(n-1)+cost[n-1],f(n-2)+cost[n-2]),即可。这道题在前面的课程中我曾经用递归完成过,现在用动态规划又是一种新的思路。这道题和斐波那契数很像,只需要想清楚从第二级阶梯开始,f(n)=f(n-1)+f(n-2),即可,这可以看作是马尔科夫链。今天是动态规划第一天,题目都比较简单,重点是要训练动规5部曲的思想。

2024-12-04 20:51:01 364

原创 代码随想录算法训练营day31|56合并区间,738单调递增的数字,968监控二叉树

要使摄像头数最少,就是在所有叶子节点都不放摄像头,局部最优是让叶子节点的父节点安装摄像头,全局最优是使摄像头数最少。这样遍历还会漏掉一种情况,就是当如下图情况时,根节点的左孩子返回值为2,右孩子返回值也为2,按照这样遍历的方法,根节点返回值为0,就不会在根节点添加摄像头。这题和前面的射爆气球等题目比较像,难度也不大,都是先按第一个元素排序后,从第一个子数组开始遍历,如果当前的子数组的第二个元素大于后一个数组的第一个元素,就更新right,反之则将当前的left和right存入数组。星海横流,岁月成碑。

2024-12-03 16:09:46 309

原创 代码随想录算法训练营day30|452用最少数量箭引爆气球 435无重叠区间 763划分字母区间

这题很巧妙的是用hash表来存储每个字母出现的最后一个位置,,局部最优是划分出某个字母的最后出现位置,全局最优是划分出所有字母的最后出现位置,因此用for循环遍历,不断根据hash表更新某子段的右边界,当i遍历到右边界时,说明该子段中所含的字母没有一个字母的最后出现位置大于该右边界,因此将该子段作为第一个子段。后来看了卡哥的代码,卡哥的代码更为简练。这题可以先排序,当前一个气球的右边界小于后一个气球的左边界时,说明一直箭不能同时射中两个气球,所以要多一只箭,以此类推即可得出最后的所需的箭的数量。

2024-11-29 15:09:16 272

原创 代码随想录算法训练营day29|134加油站 135分发糖果 860柠檬水找零 406根据身高重建队列

对于贪心的方法,卡哥提供的第二种方法比较好理解,这种方法是计算出每个站点的消耗油量和添加油量之差,从第一个站点开始累加,当累加到某个站点时总和小于0,说明在该站点之前的任何一个站点都不能作为起始站点,所以将站点更新为该站点后的一个站点。这题难度也比较大,和135分发糖果的思路很像,也是先确定一边再确定另一边,由于要确定有几个人排在所给元素前面,所以将元素从大到小排列,若大小相同则按n个人排在所给元素前面的顺序从小到大排列(因为插入元素时,n值大的后插入,所以排后面)。406根据身高重建队列。

2024-11-28 16:04:30 289

原创 代码随想录算法训练营day28|122买卖股票的最佳时机,55跳跃游戏 45.跳跃游戏II 1005.K次取反后最大化的数组和

我的理解是,因为题目中已经说明一定能到达最后一个点了,所以我们需要设置一个next范围用于记录下一步所可以到达的覆盖范围,用cur记录当前遍历的范围,因为当i遍历到cur最后一个位置时一定还未到达末尾,因此我们只需将cur更新为next同时将count++,当next>=nums.size-1时,说明下一步就能到达最后一个元素,因此不必再往下遍历,可以直接break并输出count。我的做法是先一直向后遍历找到区间上的极大值点,然后再向后遍历找到区间上的极小值点,再将两者相减,依次类推直到数组遍历完。

2024-11-27 20:28:30 308

原创 代码随想录算法训练营day27|贪心算法 455分发饼干 376摆动序列 53最大子序和

这题需要考虑的地方比较多,像对先平后下降的子段的处理、对先平后单调的子段的处理、对只有两个元素的数组的处理等。特别需要注意对连续多个元素相等的处理,当有多个元素相等时,应该忽略相同的元素,所以cur不能等于0,pre可以等于0(因为pre初始化为0),这样在相同元素的最后一个才会被记录。贪心算法还是需要多刷题多总结。这道题很简单,就是将两个数组排序,我采用的是从小到大的方法,用尽量小的饼干s[j]去看是否符合条件,若符合条件则i++,反之则j继续往后遍历直到寻找到符合条件的饼干为止。

2024-11-25 21:34:24 267

原创 代码随想录算法训练营day25|491.递增子序列 46全排列 47全排列||

这题根据题意可知不能对原数组进行排序,所以像90题的nums[i]==nums[i-1]去重操作在这里行不通,因此我们需要采取另外的方法。注意到如果我们将已经遍历过的元素存入容器里,然后在每次遍历之前先查询该容器中是否存在该元素,若存在则continue,这样就可以解决去重问题。本题set map 数组都可以,又因为本题数据范围只有-100~100,所以采取数组时间复杂度较小。因为本题存在负数,所以应该定义哈希数组used[201],当存入元素时,应该used[num[i]+100]=1以避免数组越界。

2024-11-24 13:23:40 242

原创 代码随想录算法训练营day24|93复原IP地址,78子集,90子集||

这道题的思路和分割回文串那题很像,都是构造从startindex到当前位置i的子串然后判断该子串是否符合条件,不同的是这题要控制递归的深度,当该子串中有三个数字时就应该停止递归。这题还有另一个难点就是string和long long的类型转换,我采用的是stoll函数,卡哥的方法是用for循环遍历每一位上的数字,用该数字的ascll码减去‘0’的ascll码就是该数字的数值,然后再将各个数位上的数字乘以10的相应次方即可转换为int。78子集和40组合总和的结合。今天三道题全部自己想出来了!

2024-11-24 00:09:22 370

原创 代码随想录算法训练营day23|39.组合总和,40组合总和||,131分割回文串

这题就比较难了,所以我先看了视频。判断startindex到当前位置i是不是回文子串用双指针判定,一个指针从头遍历,另一个指针从尾遍历,当两个指针对应的值不相等时就说明该子串不是回文子串,若两个指针重合则说明该子串是回文子串。这题和前面的题目基本差别不大,都是采用回溯三部曲,第一步先确定回溯的参数,这题依然需要采取startindex作为遍历开始的参数,但是与上一题不同的是由于这题的元素可以重复,所以递归函数中的startintex应该从i而不是i+1开始;

2024-11-23 17:50:33 404

原创 代码随想录算法训练营day22| 77. 组合 216.组合总和III 17.电话号码的字母组合

这题第一个难点是要处理数字与字母映射的问题,可以采取map,或者数组映射,卡哥使用的是数组映射,数组下标对应的值即为所在位置的字母,接着在backtracking函数中需要添加index参数用于记录当前遍历的digit数组的位置。这道题整体思路与77组合类似,但是这题如果不进行剪枝会TLE,可以采取的剪枝方法很多,最简单的是当当前的总和大于所求的和时return,我的做法是列方程k(k+1)+x=n,解出x的值再加上k就是i的最大值;回溯的原理实际上是n叉树,也是一种暴力的方式,常见的回溯一般和递归结合。

2024-11-21 17:00:19 227

原创 代码随想录算法训练营day21|669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

这道题刚开始做的时候我以为思路和删除二叉搜索树中的节点的题目很像,但是听完卡哥的讲解后才发现这样的想法是不对的,因为删除二叉搜索树中的节点时,二叉搜索树中只有一个符合条件的元素,因此可以找到元素时立刻return。处理完找到所需节点时的逻辑后,再处理没找到所需节点时的逻辑,即root->left=trim(root->left,val),root->right=trim(root->right,val)。这题基本思路是先将二叉树排序,然后每次取数列中的中间的值作为二叉树的节点,然后递归即可。

2024-11-20 23:23:14 231

原创 代码随想录算法训练营day20|235. 二叉搜索树的最近公共祖先 701,BST中的插入,450删除BST中的节点

这道题就必须重构二叉树结构了,应该分类讨论:空节点、叶子节点、左空右不空、左不空右空、左右都不空。另外卡哥还有一种普通二叉树的删除方法,思路同样非常巧妙,即第一次找到节点后不马上删除,而是找到要删除节点的右子树的最左侧的左子树的叶子节点并将其值与要删除节点的值交换,然后继续向下遍历,当第二次遇到要删除节点时,因为该节点已经是叶子节点,所以直接删除。因为p,q节点必定一个在左子树、一个在右子树,所以如果接着遍历,之后的节点均不是pq的公共祖先,所以找到一个节点值在两个所求节点之间,该节点必为最近公共祖先。

2024-11-19 17:57:20 349

原创 代码随想录算法训练营day18| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

如果是普通二叉树这题要用哈希表存储元素和出现的次数,然后再用vector排序,但是这题是二叉搜索树,中序遍历时单调递增,因此只需和上一题一样用双指针,然后定义一个count记录某个元素出现的次数,用maxcount记录元素出现的最大次数,当maxcount》count时,更新maxcount并清空result数组,将当前元素加入数组。可以用后序遍历实现从下向上处理二叉树,当某个节点是q或p时就返回该节点,否则返回null,然后逐层向上返回root即可,这道题回溯过程不好想,要多刷多理解。

2024-11-18 23:37:06 296

原创 代码随想录算法训练营day17|最大二叉树,617合并二叉树,700,二叉搜索树中的搜索,98验证二叉搜索树

这题要生成最大二叉树,最直接的想法就是递归。这题有很巧妙的双指针运用,利用二叉搜索树中序遍历时单调递增的性质,先定义一个pre指针为null,然后当遍历完当前节点node时把pre指向node,这样pre和node同时移动一个单位,因此只需保证pre->val<node->val恒成立即可。这题也自己AC了,同样写的很冗余,看了视频后学到了二叉搜索树的性质:左子树的值都小于中节点,右子树的值都大于中节点,这样可以减少一半的遍历时间。这题自己AC了,但是代码写得很冗余,看了卡哥的视频后精简了代码。

2024-11-17 21:36:10 217

原创 代码随想录算法训练营day16|二叉树,找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树

这道题步骤较多,首先需要取后序遍历的最后一个元素以找出根节点,然后将根节点作为界限分割中序遍历的数组并用vector存储结果,然后根据中序遍历分割后的左数组和后序遍历分割后的左数组元素个数相同这一性质,以中序遍历分割后的左数组的元素个数分割后序遍历的左数组,将剩下的元素作为后序遍历分割的右数组分别用vector存储,再递归即可。这题也是用递归+回溯的题,每递归一次将当前节点的值加入sum,然后回溯时要减去当前节点的值,最后遍历到叶子节点时若sum和target相同则返回。从中序与后序遍历序列构造二叉树。

2024-11-16 14:50:13 205

原创 代码随想录算法训练营day15|二叉树

110.平衡二叉树 (优先掌握递归)二叉树基本操作,用递归法时当任何一个子树不是平衡二叉树时全部返回-1;257. 二叉树的所有路径 (优先掌握递归)

2024-11-14 23:40:46 266

原创 代码随想录算法训练营day14|二叉树

递归法的核心是找到终止条件和单层递归,这题的终止条件是当遇到空指针时终止,单层递归是依次实现左、右、中的结构,即swap(左孩子,右孩子),再对左孩子和右孩子作为参数放入函数中,直到遇到空指针为止。这题与最大深度的题最大的不同是要考虑当左节点为空但右节点不为空或右节点为空但左节点不为空的情况,若直接将104的题解中max改为min,则会直接return0,正确答案应是在遇到叶子节点才return0,因此当左右子树只有一个为空时应该返回不为空的子树的最小深度,当均为空或均不为空时再用min。

2024-11-13 23:10:42 401

原创 代码随想录算法训练营|二叉树递归遍历,迭代遍历

前序遍历是用栈操作,先遍历根节点,然后取到根节点的左右孩子,再弹出根节点,而中序遍历是先一直遍历左孩子直到取到空指针,然后再返回取右孩子,如果右孩子为空指针则弹出,返回继续取右孩子,若右孩子不为空指针则返回取左孩子,这样就实现了左中右的遍历顺序。层序遍历是用队列实现,首先将根节点进队,然后记录队列的大小,然后将根节点左孩子、右孩子进队,再将根节点出队,每出队一次size数减一并将出队的元素加入vector,当一行里所有元素出队时,将vector加到result里面,依次类推,就可以得到一个结果。

2024-11-12 22:38:38 287

原创 代码随想录算法训练营day9|151.翻转字符串里的单词 卡码网:55.右旋转字符串 KMP算法

因为如果在p位置不匹配,就说明在p前面的所有位置都是匹配的,而如果在p前面有i相同个位置已经匹配,那么我们回退时可以直接跳过这些匹配的位置,然后直接从不相同的位置开始匹配。所以我们需要一个next数组,用于记录最长相同前后缀的长度,而关于next数组赋值时为什么不匹配时j=next【j-1】,其实是因为我们将两个字符串匹配时,我们回退要看这个不匹配位置的前一个位置的最长相同前后缀,同理,在next数组赋值时也要看不匹配位置前一个位置的最长相同前后缀。这题的思路是先将所有字母反转,然后再去除空格。

2024-11-10 23:05:28 441

原创 代码随想录算法训练营打卡day11

如果采用大顶堆,那么我们pop时会先pop父节点,这样就导致了我们最后留下的是前k小的出现频率,不合题意,因此应该采用小顶堆。我们会有惯性思维就是要三个数入队列,但实际上,只需让三个数中最大的数入队列,然后最大数前面的数弹出,最大数后面的数保留,这样遍历完整个数组,时间复杂度较小,也不会遗漏数据。这道题的难点在于要想到自己构造一个新的队列类型,使之能够实现push的同时弹出元素,pop时只弹出队列第一个元素的功能,这就需要运用到deque双向队列,这种队列两端都可以实现入队列和出队列的功能。

2024-11-09 16:03:25 426

原创 代码随想录算法训练营打卡|day10 栈与队列 有效的括号 删除字符串中的重复项

用栈实现队列,就是要把“先进后出”转换成“先进后出”,这就需要两个栈,用一个instack接收输入的数据,然后将instack中的元素弹出到另一个outstack,这样就可以实现使输出顺序改变的功能。这道题我首先想的思路是将左括号入栈,然后检查字符串中是否存在对应的右括号。在这篇文章中讲了栈与队列的底层原理,栈是先进后出,队列是先进先出,它们都是基于默认为deque的底层容器完成操作,然后对外提供接口的container adaptor 它们并不属于容器,也不提供iterator,所以不具有遍历的功能。

2024-11-09 00:16:28 262

原创 代码训练营day8|344反转字符串,541反转字符串,卡码网54.替换数字

双指针很巧妙的运用,用一个指针i遍历原本数组的长度,用另一个指针j遍历新的数组的长度,通过判断i指向的元素从而进行填充元素的操作,并且从后往前填充。这样既可以防止字符串的元素被错误覆盖,又可以在时间复杂度为o(n)的情况下完成操作,并且不占用额外的空间,真是一个很妙的双指针思路。这题可以用双指针的思路完成,用两个指针,一个从前往后,一个从后往前遍历,这样就能在o(n)的时间复杂度内完成操作。这道题是隔几个字符进行一次反转操作,整体思路和上题类似,但是要多一个判断,判断当前指针位置与末尾指针的距离。

2024-11-06 19:30:56 286

原创 代码训练营打卡day7|四数相加,三数相加,赎金信

需要注意的是剪枝时需要采用i-1而不是i+1,因为如果采用i+1,则会忽略result中有多个相同元素的情况。与三数之和的思路类似,就是在三数之和外面再加一层for循环,需要注意的是第二层循环中应该比较target与nums[i]+nums[k],而不是nums[i],即不能只比较第二层循环与target的大小,而应该比较两个数的和与target的大小。这道题与前面做过的查找字符串的元素的题目类似,难度不大,都是先用map存储一个数组的key和index,然后再在另一个数组中查找是否存在这个数。

2024-11-05 22:13:33 677

原创 代码训练营打卡day6| 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数1. 两数之和

哈希表有数组、set、map三种实现形式,数组适用于数据范围确定且数值分布较为集中的题目,set和map适用于数据范围较大或数值较为分散的题目,其中set常用于存储单个值,map常用于存储pair类型的数据,pair类型的数据包含key和value,可以通过查询key从而返回value。这道题刚开始的想法是两层for循环打暴力,显然这样会TLE,又因为同时需要数组的值和数组的下标,因此可以想到使用map,这样可以用pair型变量关联两个值。这道题是“查找某个元素是否在集合中”的类型,适合用哈希表快速查找。

2024-11-05 15:36:20 302

原创 代码随想录打卡day4|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 19.删除链表的倒数第N个节点 19.删除链表的倒数第N个节点

这题不算太难,但是要写好不容易,特别是对于current,current->next的处理要注重先后顺序,先将。环形链表,这题要用快慢指针法,涉及到一些数学知识,当快慢指针相遇的时候就可以判断是环形。双指针的操作,很巧妙的思路,将最后n个数转换成从前往后数第n个数。和删除倒数第n个节点一样的思路,都是双指针对齐后再往后数;19.删除链表的倒数第N个节点。面试题 02.07. 链表相交。24. 两两交换链表中的节点。142.环形链表II。

2024-11-03 00:01:25 223

原创 算法训练营打卡第三天|203移除链表元素,707设计链表,206翻转链表

双指针法是用current指针存储当前指向的元素,用previous指针指向下一个要指向的元素,然后用temp指针临时存储current指针的下一个元素。今天的题目比较有难度,链表这一数据类型我之前没有接触过,但是经过卡哥的讲解和我自己的思考与练习,我对链表也有了初步的了解。链表与数组不同的是链表不是在内存空间中连续分布的,而是通过指针链接,这一特性也使链表插入和删除元素较快,而查找访问元素较慢。这道题目我认为是今天题目中最难的一道,涉及到了链表所有基本操作,今天掌握得不够熟练,周末还要多加练习。

2024-11-01 23:06:46 253

原创 代码随想录算法训练营day2|209.长度最小的子数组59.螺旋矩阵II 区间和 开发商购买土地

209.长度最小的子数组刚开始的思路是用暴力,但是这样时间复杂度为O(n2),,卡哥的思路是固定结束位置,然后再对开始位置遍历,把时间复杂度降到了o(n),感觉与双指针法有异曲同工之妙。59.螺旋矩阵II这题刚开始看的时候比较无从下手,经过卡哥讲解后我明白了二分查找中的区间定义也可以用于多种题目中。区间和前缀和是一种思维巧妙很实用 而且 很有容易理解的一种算法思想,大家可以体会一下。

2024-10-31 23:18:30 368

原创 代码随想录算法训练营day1|704.二分查找 27.移除元素 977.有序数组的平方

对于数组这方面我本来有所了解,但都是浅尝辄止,直到今天看了carl的视频才彻底地理解了数组在内存中的分配方式以及erase等库函数的实质,这也使我对数组的使用有更深层次的理解。今天通过carl的视频讲解深刻地理解了二分查找左闭右开和左闭右闭区间写法的不同,也让我发现二分查找能用于多个场景。我一开始的思路是双指针取平方+sort快排,这样时间复杂度是o(n+nlogn),卡哥的解法时间复杂度更低。刚开始我想的是用erase函数,后来听了carl的双指针法后发现双指针法更为直接。977.有序数组的平方。

2024-10-30 09:58:18 284 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除