代码随想录每日训练
文章平均质量分 83
W懒大王W
这个作者很懒,什么都没留下…
展开
-
代码随想录算法训练营第四十一天|198.打家劫舍 ,213.打家劫舍II ,337.打家劫舍III
到第i个房间,dp[i]有两个来源,①不偷第i个房间,那金额就是和偷到上一个房间一样,dp[i]=dp[i-1];②偷第i个房间,由于相邻的房间不能偷,只能是从i-2个房间开始所以dp[i]等于dp[i-2]+num[i],最后取dp[i-1]和dp[i-2]+num[i]中最大值。dp[1]要不偷房间0,要不偷房间1,dp[1]=max(num[0],num[1])。这里相邻房间变成了父子节点,如果抢了当前节点,两个孩子就不能动,如果没抢当前节点,就可以考虑抢左右孩子。②尾房间在考虑范围,首房间不在。原创 2023-12-20 22:20:41 · 845 阅读 · 0 评论 -
代码随想录算法训练营第四十天|139.单词拆分,多重背包,背包问题
难点:递推公式和遍历顺序确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组递推公式总结遍历顺序总结:1.01背包二维dp数组01背包先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。一维dp数组01背包只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。2.完全背包①如果求组合数就是外层for循环遍历物品,内层for循环遍历背包。②如果求排列数。原创 2023-12-09 21:16:04 · 865 阅读 · 0 评论 -
代码随想录算法训练营第三十九天|70. 爬楼梯 (进阶),322. 零钱兑换,279.完全平方数
dp[j]同样有两个来源:①不加入当前硬币dp[j],②加入当前硬币,如果加入当前硬币,数量还要加一:dp[j-coins[i]]+1;首先这里每次跳的台阶层数可以重复,所以从前向后遍历,并且防止1,3和3,1这种情况算成一种,所以外层遍历容量j,内层遍历i。和之前目标和题目一样,dp[j]+=dp[j-value[i]],但是这题,value[i]也就是i的值,所以公式。dp[0]金额为0,所以dp[0]=0;很显然可以转换成背包问题,物品就是1到m,背包容量就是n,这里背包容量不固定,所以是一个。原创 2023-12-09 19:19:29 · 773 阅读 · 0 评论 -
代码随想录算法训练营第三十八天|完全背包,518. 零钱兑换 II ,377. 组合总和 Ⅳ
如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!②加入物品1,首先容量得腾出位置来放物品1,所以3-weight[1],也就是容量变成1了,当j=1时,dp[1]=15(最大价值是15),再加上物品1的价值value[1]=20,所以。外循环目标数,内循环物品。就是组合,但是这里要求的是组合数量,所以dp数组里不是放价值,是放组合的数量;原创 2023-12-08 15:36:58 · 835 阅读 · 0 评论 -
代码随想录算法训练营第三十七天|1049. 最后一块石头的重量 II ,494. 目标和,474.一和零
这里有点绕,可以举例说明一下,例如有三个石头2,7,4,dp[9]和dp[10]其实都等于2+7,因为如果加上4,重量会超过我们要求的目标值10,实际上dp[9]到dp[12]都等于2+7,但如果目标值是13,dp[13]=2+7+4。获得dp[i][j]同样有两种方式,加入当前元素,dp[i-zero][j-one]+1,或者不加dp[i][j];注意如果数组[0,0,0,0,0],j=0时,以输入:["10","0001","111001","1","0"],m = 3,n = 3为例。原创 2023-12-07 17:09:16 · 832 阅读 · 0 评论 -
代码随想录算法训练营第三十六天|01背包问题 二维 ,01背包问题 一维 ,416. 分割等和子集
最好的结果就是分成两个子集和相等,既然和相等,那么子集的和就是总和的一半,也就是说,从nums数组种取出元素,能够满足和等于总和的一半,那么结果就是true。在使用二维数组的时候,递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);第i件物品的重量是weight[i],得到的价值是value[i]。最开始j=0时候,装不了物品。原创 2023-12-06 21:52:00 · 861 阅读 · 0 评论 -
代码随想录算法训练营第三十五天|343. 整数拆分,96.不同的二叉搜索树
上一步分析到j从1开始,但是dp[j-1]可能等于dp[0],所以我们初始化就是dp[0]=1,这样dp[1]=dp[0]*dp[0]=1;都在右子树上,所以以3为头节点,加上两个节点组成的二叉搜索数就等于dp[2],和以1开头一样;从例子3来看,有5个二叉搜索树,两个以1为头节点,两个以3为头节点,一个以2为头节点。元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量。那么公式等于dp[i]=dp[j]*dp[i-j]。原创 2023-12-06 19:42:48 · 833 阅读 · 0 评论 -
代码随想录算法训练营第三十四天|62.不同路径,63. 不同路径 II
dp[i][j]=dp[i-1][j]+dp[i][j-1],如果遇到障碍怎么办,也就是当前i,j位置没有路径过来,递推直接跳过。每个位置也只能是从左边或者上面来,所以达到i,j位置,dp[i][j]=dp[i-1][j]+dp[i][j-1]。题目是求到达右下角多少不同路径,所以dp应该是二维数组dp[i][j],表示到达i,j坐标位置有多少条不同路径。首先i=0时,不管j等于多少,dp[0][j]都是等于1;同样j=0时,dp[i][0]都是等于1。1. 向右 -> 向右 -> 向下 -> 向下。原创 2023-12-03 01:58:02 · 1002 阅读 · 0 评论 -
代码随想录算法训练营第三十三天|509. 斐波那契数 ,70. 爬楼梯 ,746. 使用最小花费爬楼梯
和爬楼梯类似,i层可以从i-1层爬一步到达,也可以从i-2层爬2步到达,dp[i]=dp[i-1]+dp[i-2],但这题不是求种类,而是花费,所以dp[i]应该是选dp[i-1]与dp[i-2]中的最小花费。转换成公式就是dp[i]=dp[i-1]+dp[i-2]。dp数组:0,0,1,2,2,3,3,4,4,5,6。上第0层台阶和上第1层台阶都不需要花费,dp[0]=0,dp[1]=1。dp[i]在这里表示到i层台阶有dp[i]种方法。相应的,i要从3开始。n=5时,dp数组为0,1,1,2,3,5。原创 2023-12-01 10:42:12 · 884 阅读 · 0 评论 -
代码随想录算法训练营第三十一天|435. 无重叠区间 , 763.划分字母区间 , 56. 合并区间
首先需要对intervals排序,以每个数组的右边界排序,再将第一个数组的右边界作为起始点,循环比较前数组的右边界和后数组的左边界。首先按照数组的左边界排序,再比较前数组后边界和后数组的前边界,如果包含,就就将后数组的后边界和前数组前边界当成合成的区间,如果不包含,当前数组没有其他数组包含它,直接加入结果数组。②两个数组存在包含关系。明确一点,如果前一个数组的右边界大于后一个数组的左边界就算重叠,利用这个统计不重叠的数组个数,剩下的就是重叠的个数。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。原创 2023-11-29 21:26:50 · 789 阅读 · 0 评论 -
代码随想录算法训练营第二十八天|122.买卖股票的最佳时机II , 55. 跳跃游戏 ,45.跳跃游戏II
其次,考虑i如何更新,假设是例子[2,2,1,1,4],第二个2的范围到1,但是没到最后,那么i应该在1位置上,重新找最大范围,所以这里i每次遇到最大范围位置时候直接更新。由于每次都只能持有一只股,利润就是卖出股的一天减去买进股的一天,这里就可以拆分,例如第一天7买进,第三天5卖出,那利润等于-2,-2=1-7+5-1;例如情况[3,2,1,0,4,5]这种情况其实不算,虽然4的位置上可以跳到最后元素,但是它不在之前的跳跃范围内,在它之前没有数的跳跃范围可以覆盖它,所以。你也可以先购买,然后在。原创 2023-11-27 19:16:05 · 897 阅读 · 0 评论 -
代码随想录算法训练营第二十七天|455.分发饼干,376. 摆动序列,53. 最大子序和
或者左差值小于0,右差值大于0;显然这种情况最长为二,但这里 一开始是只有上坡,所以假设前面添加一个元素,那么pre=0&&cur>0算一个顶峰,再加初始的一个元素顶峰,结果为二。使用贪心算法优化过程,如果当前“连续和”为负数的时候就立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。这里连续相同的数,其实就算一种,所以可以跳过相同的,那这里可以算pre>0&&cur=0或者。大尺寸的饼干可以满足小胃口也可以满足大胃口,为满足更多孩子,大尺寸饼干先拿给大胃口孩子。原创 2023-11-26 20:35:07 · 804 阅读 · 0 评论 -
代码随想录算法训练营第二十五天|491.递增子序列,46.全排列,47.全排列 II
对491题来说,不知道后面组合的元素是否在本层出现过,所以利用unordered_set判断出现过没有,每层它所能组合的数个数可能不相同(由于子序列不要递增,90题每次组合都知道数组中还剩下哪些数没有组和,所以开始就可以使用定义记录元素是否被使用,),也就相当于对本层能组合的数进行去重,所以每层都重新定义一个记录使用情况的数组。这题很简单没有组合结果去重,每个元素都可以组合,相同元素都可以,但是使用过的元素不可以再使用只能从剩下的元素中取。,因为每次都会重新定义,它的作用就是保持当前层不出现重复的数。原创 2023-11-23 19:59:27 · 815 阅读 · 0 评论 -
代码随想录算法训练营第二十四天|93.复原IP地址,78.子集 , 90.子集II
其次如果切割到最后都满足,字符串中“.”的个数应该等于3,并且字符串要合法,然后加入到结果数组中。这里参数首先需要字符串s,其次还需要一个参数start记录每次遍历的起点。首先需要两个数组,一个记录所有结果的二维数组r,一个记录单一结果的一维数组p;参数需要nums数组,一个记录遍历起点的start参数。,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。的组合,首先每个树节点都算一个组合,其次树层需要去重。个数加一,然后递归遍历后面字符串,最后回溯,个数减一。首先将空元素加入r数组中,再循环。原创 2023-11-21 10:12:27 · 22 阅读 · 0 评论 -
代码随想录算法训练营第二十三天|39. 组合总和,40.组合总和II ,131.分割回文串
参数首先需要candidates和target,其次需要sum记录当前数字和,需要used数组,需要start记录每次开始位置防止每次结果出现重复使用的数字。,说明以当前数字为开始的组合,很有可能和上一个同样的数字的组合重复。首先确定组合内数字不去重,逻辑和之前题目类似,用过就不再用(这里用过不是说数字重复),每次递归都从当前数字的下一个数字开始,保证用过的数不出现(i+1);每次遍历开始都要将sum加上当前数字,当前数字进入数组p中,再递归,最后回溯,数组p弹出当前数字,所有结果就存储在r中。原创 2023-11-20 13:21:42 · 27 阅读 · 0 评论 -
代码随想录算法训练营第二十二天|216. 组合总和 III,17.电话号码的字母组合
单一结果的数组存储当前的字母,然后递归下一个字母集,例如当前字母是a,递归字母集就是n[3]='def'。最后如果没有满足添加的组合,回溯,单一结果的数组存储当前的字母。再看宽度,宽度每次跟digits里的元素值有关,如果是2-9,每次组合的数组长度就为3,如果是1或2,那数组就是空。首先和加上当前数字,再从剩下数字递归,如果结果不符合,需要回溯剪去当前数,和也要减去当前数。首先两个参数k和n,其次还要一个记录每次递归开始的记录参数,最后需要一个参数记录当前累加的和;的字符串,返回所有它能表示的字母组合。原创 2023-11-18 19:31:46 · 31 阅读 · 0 评论 -
代码随想录算法训练营第二十一天|回溯算法理论基础,77.组合
第一步:确定返回值和参数;回溯算法中函数返回值一般为void;回溯算法参数可能有很多,根据具体题目再确定。第二步:确定回溯算法终止条件;第三步:确定回溯搜索的遍历过程。for循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。backtracking这里自己调用自己,实现递归。原创 2023-11-17 15:21:57 · 29 阅读 · 0 评论 -
代码随想录算法训练营第二十天|669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树
观察每个节点替换的数,可以知道每个节点的值都换成了中序遍历数组中从该节点起往后数组的累加数。例题中的中序遍历数组是[0,1,2,3,4,5,6,7,8],变成累加数之后变成[36,36,35,33,30,26,21,15,8],累加顺序刚好是从右向左,反中序遍历。第二步:当前接入符合边界范围的左右子节点,这里相当于剪去不符合要求的节点,但是子节点还要接上;树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。所以结果应当返回修剪好的二叉搜索树的新的根节点。原创 2023-11-16 13:30:12 · 23 阅读 · 0 评论 -
代码随想录算法训练营第十八天|530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236. 二叉树的最近公共祖先
中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(用vector统计map中元素,再排序,最后将频率最高的数记录在数值中,有可能有很多个。记住二叉搜索树的特点,如果用中序遍历,那么遍历结果一定是一个有序递增序列,所以统计最小差值就行。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。节点 5 和节点 1 的最近公共祖先是节点 3。差值是一个正数,其数值等于两值之差的绝对值。给你一个二叉搜索树的根节点。原创 2023-11-14 21:32:01 · 34 阅读 · 0 评论 -
代码随想录算法训练营第十七天|654.最大二叉树,617.合并二叉树 , 700.二叉搜索树中的搜索 , 98.验证二叉搜索树
[3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1]。- [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 []。二叉搜索树有一个特性,左子节点小于父节点,父节点小于右子节点。思路:分别对两个树遍历,左节点和左节点比,右节点和右节点比。- 空数组,无子节点。原创 2023-11-13 19:17:33 · 26 阅读 · 0 评论 -
代码随想录算法训练营第十二天|144. 二叉树的前序遍历,145. 二叉树的后序遍历,94. 二叉树的中序遍历
思路:二叉树的前中后遍历都可以用递归来解决。解决:注意前中后三种遍历的顺序就可以。原创 2023-11-12 17:01:53 · 27 阅读 · 1 评论 -
代码随想录算法训练营第十六天|513.找树左下角的值,112. 路径总和,106.从中序与后序遍历序列构造二叉树,105.从前序与中序遍历序列构造二叉树
②利用后序数组最后元素分割中序数组,分为中序左数组和中序右数组;③再利用中序左数组和中序右数组分割后序数组,分为后序左数组和后序右数组;从根节点开始依次搜索子节点,最后相加结果要等于总和,这里采用递归和回溯来判断是否接近于目标值。②如果左右子节点都是叶节点但和不是目标值,返回false;这里和上题类似,用前序和中序确定二叉树,前序是从前序数组第一个元素分割。这里找左下角的值,要满足两个条件,一是最底层,二是最左边。,后序分割则不需要,根据中序左数组和中序右数组分割就行。中序分割和后序分割的区别,原创 2023-11-11 20:11:35 · 33 阅读 · 1 评论 -
代码随想录算法训练营第十四天|104.二叉树的最大深度,111.二叉树的最小深度,222.完全二叉树的节点个数
的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。首先要判断一个节点的左右子孩子的深度是否一样,一样说明以该节点为根节点的二叉树是满二叉树,如果不一样就分别在判断以左右子孩子为根节点的二叉树是否是满二叉树。采用递归方式,求一个节点的深度,先求左子树的深度,再求右子树深度,最后取左右子树最大深度,再加上自身深度1就是该节点的深度。注意这里最小深度的定义,必须是到叶子节点的最短路劲上的节点数量。叶子节点是指没有子节点的节点。原创 2023-11-09 20:05:24 · 30 阅读 · 1 评论 -
代码随想录算法训练营第十三天|102.二叉树的层序遍历,226.翻转二叉树,101. 对称二叉树
先让二叉树的顶点进队,出队时将其左子节点和右子节点入队(不为空),后面所有节点在出队之后都将其左右子节点入队。这里需要两个数组,一个二维数组记录所有层遍历的结果,一个一维数组记录当前层的结果。采用递归方式,递归的原则就是①和②,当然在递归之前需要判断左右子节点的其他情况。解决:这里需要先对节点遍历,再交换,采用前序遍历和后序遍历都可以。这里观察一下对称的要求,一个节点的左右子节点要相等;,翻转这棵二叉树,并返回其根节点。左子节点的左节点和右子节点的右节点。左子节点的右节点和右子节点的左节点。原创 2023-11-08 10:45:19 · 32 阅读 · 1 评论 -
代码随想录算法训练营第十一天|239. 滑动窗口最大值,347.前 K 个高频元素
pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。首先需要统计频率前k高的元素,这里可以采用map来统计每个数出现的次数.然后采用堆来进行排序,由于堆每次弹出元素都是堆顶,所以这里采用小顶堆,让前k个大的数保留在队中。的滑动窗口从数组的最左侧移动到数组的最右侧。原创 2023-11-06 17:10:35 · 21 阅读 · 0 评论 -
代码随想录算法训练营第十天|20. 有效的括号, 1047. 删除字符串中的所有相邻重复项 ,150. 逆波兰表达式求值
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。遇到左括号直接让其对应的右括号进栈,如果遇到右括号和栈顶元素比较,1.左括号多了,说明最后栈中没有和右括号匹配的左括号,2.右括号多了,栈没有元素了,但是有剩余字符串,3.中间括号不匹配,就是出栈元素和右括号不相等。依次进栈,进栈之前判断入栈元素和栈顶元素是否相同,最后将栈里元素出栈,就是剩下字符串,但顺序相反需要反转一下。在 S 上反复执行重复项删除操作,直到无法继续删除。原创 2023-11-05 21:44:16 · 25 阅读 · 1 评论 -
代码随想录算法训练营第九天|232.用栈实现队列,225. 用队列实现栈
队列的元素是先进先出,用队列来实现的话,进队就相当于进栈,出队应该让栈里元素先出栈,再进栈,最后出栈,就可以实现先进先出,所以这里需要两个栈,一个输入栈,一个输出栈。栈是先进后出,用队列实现的话,就相当于队列最后进队的元素需要先出队,这里用一个队列记录最后元素前的所有元素。先让原始队列出队放入到备份队列中,最后一个元素出队,返回;再让备份队列元素出队进原始队列。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(先将输入栈中元素出栈,再放进输出栈,最后输出栈中元素出栈。原创 2023-11-03 11:24:32 · 30 阅读 · 0 评论 -
代码随想录算法训练营第八天|字符串总结,双指针法,KMP算法
https://www.processon.com/v/654322ea94ee25571ada9132https://www.processon.com/v/6543596620d3411d2e47ff49 KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。 前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。 前缀是指不包含最后一个字符的所有以第一个字符开原创 2023-11-02 16:47:10 · 42 阅读 · 0 评论 -
代码随想录算法训练营第六天|454. 四数相加 II,383. 赎金信,第15题. 三数之和,第18题. 四数之和
这题是上一个题目的进化,四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况。k从0开始,i从k+1开始,left从i+1开始,right从最后开始,同样先对数组进行排序,如果nums[k]>0和nums[k]+nums[i]>0这两个情况出现,直接退出。尝试用哈希表写不下去,时间也超时,看讲解视频尝试用双指针。原创 2023-10-31 23:21:43 · 44 阅读 · 1 评论 -
代码随想录算法训练营第七天|344. 反转字符串,541. 反转字符串II,122. 路径加密 , 151.翻转字符串里的单词 , 剑指Offer58-II.左旋转字符串
' ',就s[slow]=s[fast],再移动slow和fast,s[fast]=' '停止,除了slow等于0时候,每次s[fast]!=' '时,都要先补充空格(s[slow]=' '),slow再向右移动一格,作为下次填充单词的起点。先反转字符串,两端指针向里缩进,依次交换就可以;再局部反转回单词,从第一个字母开始到空格前一个字母,就是要反转的单词,再移动起点继续反转单词。可以用快慢指针,快指针指向字母就加入慢指针,如果快指针遇到空格,慢指针就自己补充一个空格,再让快指针移动,遇到字母再加入。原创 2023-11-01 15:11:30 · 50 阅读 · 0 评论 -
代码随想录算法训练营第五天|242. 有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
利用哈希表,遍历过的数字放在哈希表中,未遍历过的数字只要在哈希表中找到一个数相加等于目标值就可以返回下表。然后记录平方和,这时候可以用哈希表,和出现一次数值变1,如果再出现,说明陷入死循环,直接退出,如果最后有数字为1,返回true就行。用暴力方法依次寻找可以做出来,取一个数,遍历剩余的数,如果当前的数没有找到一个合适的数,那就再取下一个数,继续遍历剩余的数,最后找到就输出两个数的下标。记录一下s字符串字母出现的次数,如果该字母在t字符串中出现,次数减一,最后如果所有的字母次数都是0,说明是字母异位词。原创 2023-10-30 16:47:45 · 23 阅读 · 0 评论 -
代码随想录算法训练营第四天|24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II
问题简单来看就是两个指针最后有没有指向同一个元素,如果指向就说明有交点,那就有一个前提,这两个指针必须同时移动并且同时开始位置要一致,这就引出下一个问题,如何使两个指针在同一位置开始移动?上一步交换完了,应该是1节点的next指向4节点,所以下一步循环应该从1结点开始,cur从虚结点开始,往后移动了两次,指向1节点。利用滑动指针或者说左右指针,先从结果分析,最后左值针应该指向倒数n+1个节点上,右指针应该指向链表尾节点的下一个,right-left刚好等于n+1;链表中有一个环,其尾部连接到第二个节点。原创 2023-10-28 17:39:12 · 87 阅读 · 0 评论 -
代码随想录算法训练营第三天|203.移除链表元素,707.设计链表,206.反转链表
翻转的话就是改变指向顺序,例如1指向2变成2指向1,这时候又有点像双指针,一前一后,往后移动依次翻转,最后输出前指针就可以,这里不要输出后指针,因为最后后指针会滑出去,指向空,所以循环停止的条件也是后指针不为空。问题关键是找到index之前节点,也就是说如果节点的next是下标为index的节点,那就找到了插入位置;两个指针用来翻转相邻元素,一个指针(蓝色指针)记录下一个需要处理的节点,循环处理,直达后指针指向NULL结束。先记录一下第一个节点,也就是头节点,虚节点指向新节点,新节点指向记录节点;原创 2023-10-27 21:45:28 · 202 阅读 · 1 评论 -
代码随想录算法训练营第二天|977. 有序数组的平方、209.长度最小的子数组、 59.螺旋矩阵II
先看从左到右打印(图中红色部分),起点:[0][0],终点[0][1],终点差一格就到边界,从上到下打印(图中黄色部分),起点[0][2],发现起点刚好是上一次打印的下一个位置;一开始想着不就是绕圈转嘛,然后动手写发现很多需要判断的地方,向左打印,向下打印,向右打印,向上打印,四个打印什么时候停,就陷入了循环中。应该是大的指针移动。右指针依次向右移动,加入新的值,判断窗口里的数值和,小于目标数,继续移动,大于等于目标数,不移动,重新分析,既然是一个正方形,就想办法让四个打印数一致,除了方向变了,其他不变。原创 2023-10-26 10:34:34 · 418 阅读 · 0 评论 -
代码随想录算法训练营第一天/ 704. 二分查找、27. 移除元素
2.左闭右开:目标数在[left,right),这时候while里面应该(left<right),因为在左闭右开区间left=right没有意义,right更新为mid,即:下一个查询区间不会去比较nums[middle]例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。解法:双指针左指针遇到目标值val停下,移动右指针,遇到不是val停下,交换左右指针的值,左右指针分别往右往左移动。的元素,并返回移除后数组的新长度。原创 2023-10-25 20:37:21 · 514 阅读 · 0 评论