自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第四十六天| 647. 回文子串、516.最长回文子序列

题目:思考:1、确定dp数组(dp table)以及下标的含义布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。2、确定递推公式在确定递推公式时,就要分析如下几种情况。整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。当s[i]与s[j]不相等,dp[i][j]一定是false。当s[i]与s[j]相等时,有如下三种情况3、dp数组初始化dp[i][j]初始化为false。

2025-06-22 17:43:41 307

原创 代码随想录算法训练营第四十五天|115.不同的子序列 、583. 两个字符串的删除操作、72. 编辑距离

思考:本题相当于在s中寻找几种元素的组合方式得到t,组合必须遵从原来字符的顺序。也就是对s中无用的字符进行删除,剩下的组合得到t。采用动态规划进行解题:1、确定dp数组(dp table)以及下标的含义dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。2、确定递推公式要分析两种情况当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。

2025-06-22 17:14:01 484

原创 DiMTAIC 2024 数字医学技术及应用创新大赛-甲状腺B超静态及动态影像算法赛-参赛项目

去年参加完这个比赛之后,整理了项目文件和代码,虽然比赛没有获奖,但是参赛过程中自己也很有收获,自己一个人搭建了完整的pipeline并基于此提交了多次提高成绩,现在把这个项目梳理成博客,便于以后学习借鉴。提出的方案提出的方案。

2025-06-08 18:54:00 722 1

原创 代码随想录算法训练营第四十四天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列

思考:对于两个字符串,计算最长公共子序列的长度,首先定义dp数组dp[i][j],长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]。如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;

2025-06-08 18:42:58 303

原创 代码随想录算法训练营第四十三天|300.最长递增子序列 、674. 最长连续递增序列、718. 最长重复子数组

思考:从动态规划算法思想出发,dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度。位置i的最长递增子序列长度等于j从0到i-1各个位置的最长递增子序列长度 + 1 与i位置最长递增子序列长度的最大值。所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1)。每一个i,对应的dp[i](即最长递增子序列)起始大小至少都是1。i和j采用两层for循环遍历,从左到右。

2025-06-08 17:12:56 141

原创 代码随想录算法训练营第四十二天|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

中途因为备考中断了刷题,接下来的日子里把后面落下的部分补上。

2025-06-04 00:33:14 723

原创 代码随想录算法训练营第四十一天|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

思考:要在股票交易中获得最大利润,则买入价格与卖出价格的差值要最大。那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);dp[0][0]表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以dp[0][0] = -prices[0];

2025-05-10 21:39:35 435

原创 代码随想录算法训练营第三十九天|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

思考:本题需要最大化结果,但是相邻的两个房屋只可以偷一个,因此需要判断是否偷当前房屋,判断依据就是当前房屋i与上上一个房屋i-2两个房屋的金钱之和与上一个房屋i-1的大小关系。由于只有n个房屋,dp数组长度为n即可,递推公式涉及到三个数据,因此需要初始化dp数组前两个元素。而房屋数量小于三的情况可以提前单独处理。dp[0]表示只有一个房屋,则其值为这个房屋的金额。dp[1]表示有两个房屋的情况下偷到的最大金额,由于相邻房屋只可以选一个,因此要在两个房屋之间取最大值。

2025-04-26 13:28:17 297

原创 代码随想录算法训练营第三十八天|322. 零钱兑换、279.完全平方数、139.单词拆分

思考:本题兑换零钱要求最少硬币数,由于每个硬币可以无限次使用,所以本题还是完全背包问题。与以往完全背包问题不同,本题不是计算组合数量,而是使用最少硬币数量。因此dp数组的含义发生了变化,对于dp[j],j表示硬币组成的金额,dp[j]表示组成金额j使用的最少硬币数。理解dp数组含义后,才能理解递推公式dp[j] = min(dp[j], dp[j-coin]+1),对于硬币coin,采用这个硬币后,目标金额j被减少coin,硬币使用数量+1。

2025-04-26 12:26:38 308

原创 代码随想录算法训练营第三十七天|518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯

思考:本题需要求数组coins元素组合求和为amount的组合数,且数组元素可以重复使用。本题是动态规划算法的完全背包问题,与01背包不同之处就在于数组元素可以重复使用。dp数组表示当amount=j的时候有dp[j]种组合,特别的,当j=0时,dp[j]=1,即有一种组合可以满足amount=0,那就是不选任何元素。

2025-04-24 21:51:24 310

原创 代码随想录算法训练营第三十六天|1049. 最后一块石头的重量 II、494. 目标和、474.一和零

思考:本题简化题意,就是数组中的元素两两进行抵消,剩下的数值作为新元素,继续抵消下去,直到数组只有一个元素,返回这个元素的最小值。为了剩下的元素最小,则应该尽量让所有元素被抵消,则首先应考虑尽量等份数组元素,使得抵消双方的大小尽量接近,最好的情况就是抵消的双方都是数组元素和的一半,这样最后结果就是0.如何让抵消的双方大小尽量接近数组元素和的一半,这就转化为01背包问题,容量为数组元素和的一半的背包,如何尽可能装满且装进的元素和最大。

2025-04-22 23:09:49 259

原创 代码随想录算法训练营第三十五天|416. 分割等和子集、698.划分为k个相等的子集、473.火柴拼正方形

这里要注意的是,本题与在某个数组中寻找是否存在元素target不一样,因为本题的target不一定是一个元素,可以是多个元素之和,具体是几个元素之和不确定。因此需要结合01背包思想解决问题,将寻找元素和为target的问题转化为容量为target的背包,恰好需要装满的问题。思考:本题要将数组分为两个子数组,且两个子数组和相等,因此首先可以想到的条件就是数组可分为两个,这要求数组元素数量>1,要想两个子数组和相等,则原始数组和为偶数才行。:将数组排序,先处理较大的数,可以更快地剪枝无效路径。

2025-04-20 20:15:56 430

原创 代码随想录算法训练营第三十四天|62.不同路径、63. 不同路径 II、343.整数拆分、96.不同的二叉搜索树

思考:本题可以考虑二叉树的递归遍历,但是会超时。这个时候就需要考虑更快的算法比如动态规划,确定好初始值和递推表达式。由于机器人每次只能向右或者向下走一步,因此对于某个位置[i,j],只能从其左边或者上面的位置走一步来到当前位置,即递推表达式为初始值的话,对于网格的第一行或第一列,机器人都只能按照直线行走,即路径的可能性为1。有了这些信息就可以采用dp数组进行求解。

2025-04-14 23:30:10 493

原创 代码随想录算法训练营第三十二天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

思考:这道题对于有数学基础的人来讲并不复杂,只要清楚理解递推公式,并初始化好前两项值,就可以由递推公式计算结果。F(n) = F(n - 1) + F(n - 2),其中 n > 1在代码实现层面,通过递归实现对前两项的求和。

2025-04-13 16:01:26 245

原创 代码随想录算法训练营第三十一天|56. 合并区间、738.单调递增的数字、968.监控二叉树

思考:本题需要对有重叠区间进行合并,最终结果存放多个无重叠的区间。首先对原始数组按照区间左边界由小到大排序,这样便于从左到右遍历区间。每次结果保存的都是一个区间,只有当无重叠的情况才会保存该区间,这个被保存的区间需要随着遍历更新,因此初始化left和right为数组的第一个区间的左右边界。相邻两个区间不重叠时,前面的区间就可以被保存下来,然后left和right就切换为下一个区间的左右边界。相邻两个区间重叠时,新的左边界是两个区间左边界的最小值,新的右边界是两个区间右边界的最大值。

2025-04-13 14:53:15 460

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

思考:本题需要判断相邻气球的重叠情况,有重叠的话可共用一支箭,无需加箭。判断相邻气球重叠,则需要下一个气球的左边界<=上一个气球的右边界,同时需要更新二者重叠区间的右边界,以此和再下一个气球进行判断。当遍历完整个数组后,即可得到最少的箭数(这里要注意的是数组需要提前排序,按照气球左边界由小到大排序)。

2025-04-13 11:37:54 157

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

思考:为了使得汽车可以跑一圈,汽车在每个站点的时候邮箱里都是有油的,即从上一个站点加油开车过来消耗后还剩下油。如果中途某个站点汽车没有剩余油,则说明当前选择的起点不满足要求,更换起点。(从第一个点开始作为起点,不满足条件则换下一个点作为起点)当汽车跑完一圈回到起点时,也要保证此时车内有剩余的油才行。

2025-04-11 00:47:33 363

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

思考:买卖股票想要利润最大,则每次买卖都是赚钱的,即每一次的利润都是正数。第一天只能买入,不能卖出,因此卖出操作最早在第二天才可以。因此可以从第二天开始,计算相邻两天的利润,把正数的利润求和,就是最大利润。

2025-04-08 21:44:57 386

原创 代码随想录算法训练营第二十七天|455.分发饼干、376. 摆动序列、53. 最大子序和

思考:为了尽可能满足最多的孩子的胃口,则饼干应尽量不造成浪费,即每一块饼干都匹配给了饼干可以满足的胃口最大的孩子。题目中s存在空值,则当没有饼干的时候可以满足的孩子数量为0。为了达到每一块饼干都给了饼干可以满足的胃口最大的孩子,故需要把饼干由大到小、孩子胃口由大到小进行遍历,使得大饼干给了胃口大的孩子。用for循环由大到小遍历孩子的胃口,用指针由大到小遍历饼干尺寸,当饼干尺寸可以满足孩子胃口时,指针左移,计数结果+1.

2025-04-07 21:29:16 269

原创 代码随想录算法训练营第二十五天|491.递增子序列、46.全排列、47.全排列 II

思考:本题给出的数组已经是递增顺序,数组元素存在重复,且在一个结果中可以出现两个相同元素作为递增序列,因此在遍历树结构时,同一层级需要元素去重,这里采用集合记录元素使用情况。其余部分采用递归+回溯思想实现。

2025-04-05 17:44:32 192

原创 代码随想录算法训练营第二十四天|93.复原IP地址、78.子集、90.子集II

思考:本题需要在给出的字符串中分割三次,每次采用"."进行分割,分割后的四个部分,每一部分都要满足:(1)是不以0开头的整数;(2)范围在0-255之间。分割次数达到3次作为终止条件,对于每一段分割的字符内容,都需要判断合法性。只有当前一段合法后,才会递归到下一段。

2025-04-05 16:34:07 214

原创 代码随想录算法训练营第二十三天| 39. 组合总和、40.组合总和II、131.分割回文串

思考:本题也可以抽象为在一个树结构中寻找路径,使得路径上的节点之和为target,特别之处在于本题相同元素可以重复使用,因此对于树结构的每个节点,可选值的范围都是相同的。在选值时需要考虑的就是路径和与target的大小关系,等于target和大于target这两种情况都是终止条件。结合递归与回溯去遍历树结构,循环结构中其实可以无限循环,只有达到终止条件才会退出。

2025-04-03 20:41:18 255

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

思考:组合问题,可以理解为在树结构中找路径的问题,这样便于理解递归+回溯的思想。如下图:在[1, n]中寻找k个数字的所有组合情况,相当于在这样一个树结构中寻找不同的路径。最后返回的结果,就是把所有路径放在一个数组中。寻找路径相当于遍历这棵树,因此需要递归,在这个树的节点上,可以有多种选择,比如取2,取3,取4,因此需要回溯。当一个路径包含的元素数=k时,该路径符合要求,可以保存下来。由于是寻找组合情况,相同数字不可以重复取,因此当取过一个数字时,剩下可以取的数字数量就是d=k - len(path)

2025-04-02 23:54:07 355

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

思考:本题类似,本题给出的是[low, high]区间,在区间内的节点保留,不在区间内的删除,450题是值等于key的节点删除,两道题其实都需要删除节点重构二叉树,故解题方法其实相同,基于递归遍历二叉树,分情况讨论。两道题的难点就在于情况很多,可能有遗漏。大体上还是四种情况:(1)当前节点无左右子树,根据当前节点值与区间[low, high]的关系返回空值或保留当前节点;(2)当前节点只有左子树,先判断当前节点能否保留,再递归左子树;(3)当前节点只有右子树,先判断当前节点能否保留,再递归右子树;

2025-04-01 21:10:00 305

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

思考:本题类似,不同点在于本题为二叉搜索树,采用236题解法也可以做,但是没有使用到二叉搜索树的性质,即对于每一个节点,左节点数值小于根节点,右节点数值大于根节点。因此可以考虑通过比较节点的数值大小求解,若目标节点p,q的数值都比当前节点小,则p,q的最近公共祖先一定在当前节点的左子树中;若目标节点p,q的数值都比当前节点大,则p,q的最近公共祖先一定在当前节点的右子树中;若目标节点p,q的数值相比当前节点一大一小,则p,q的最近公共祖先为当前节点。整体还是基于递归的思想去遍历节点。

2025-03-31 20:22:21 231

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

如果两个目标节点都在右子树中找到,则右节点就是公共祖先。思考:找到众数,就需要统计每个数字出现的频率,会想到采用哈希表做统计,在python中采用字典进行存储。思考:首先一个节点自身可以是自己的祖先,若两个指定节点中有一个是二叉树的根节点,那么它就是公共祖先。这里需要知道,二叉搜索数本身是有序的,即左节点的值小于根节点值,右节点的值大于根节点值。然后对统计结果进行频率排序,找到出现频率最大的元素,保存到结果数组中。如果在左右子树各找到一个目标节点,则当前节点就是它们的公共祖先。501.二叉搜索树中的众数。

2025-03-29 23:09:40 299

原创 代码随想录算法训练营第十七天| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

思考:本题可以理解为将一个二叉树叠加到另一个二叉树上,如果对应位置节点重叠,则两棵树的对应节点值相加,如果对应位置一棵树有节点另一个无节点,则该位置直接采用有节点的树的节点,同样采用递归思想构建左右子树。思考:二叉搜索树的规律是,对于所有的节点,其左节点数值小于根节点,右节点数值大于根节点,因此二叉搜索树是有序的。,都是通过寻找最大值作为根节点,最大值左右两侧元素用于构建该根节点的左右子树,采用递归思想。思考:二叉搜索树的规律是,对于所有的节点,其左节点数值小于根节点,右节点数值大于根节点。

2025-03-28 14:37:47 182

原创 代码随想录算法训练营第十六天| 513.找树左下角的值、112.路径总和、113.路径总和II、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

方法一致,在这类题目中,前序遍历或者后续遍历可以最先获取到根节点元素值(前序遍历第一个元素是根节点值,后序遍历最后一个元素是),然后找到中序遍历结果中根节点值的索引位置,划分左右子树元素。中序遍历是左根右,后续遍历是左右根,两种都是左子树的元素在数组左侧,去除根节点后,右侧都是右子树的元素,根据元素数量相等可以在后续遍历结果中划分出左右子树的元素。思考:首先可以根据后续遍历的最后一个元素值确定根节点,其次,在中序遍历的结果中,根节点值左右的元素分别是根节点的左右子树的节点值,由此可以划分出左右子树的元素。

2025-03-28 00:42:15 349

原创 代码随想录算法训练营第十五天| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

思考:平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。但是求高度与求深度的逻辑其实还是类似的,采用递归法分别计算左右子树的高度,二叉树的高度就在子树最大高度的基础上+1。思考:本题需要统计二叉树的所有路径,对于每条路径,只有当前节点不存在子节点的时候,才算完成走完一条路径,此时才可以对路径结果进行转换,生成符合题目要求的字符串形式。思考:由题意可知,左叶子是一个没有子节点的左节点。对于每个子节点,统计该节点下面的所有路径后,需要返回上一级,以便于统计其他子节点的路径,即回溯。

2025-03-26 22:44:03 180

原创 代码随想录算法训练营第十四天| 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

换个角度,将这个二叉树复制一份,则有两个二叉树AB,A的左子树与B的右子树完全一样,A的右子树与B的左子树完全一样。思考:二叉树的最小深度,需要找到根节点到叶子结点的最小距离。思考:二叉树的最大深度,即左右子树的最大深度+1,具有最大深度的路径一定在二叉树的最底层,因此进行递归,直到左右子树为空,即从最末一层节点开始,然后逐级向上+1进行递归。完全一样就是要么都为空,要么都不为空且两个节点值相等,两个节点的左右子树镜像相等(即A的左子树与B的右子树完全一样,A的右子树与B的左子树完全一样)。

2025-03-25 22:58:30 214

原创 代码随想录算法训练营第十三天| 二叉树递归遍历、层序遍历

今日题目144.二叉树的前序遍历题目链接:144. 二叉树的前序遍历 - 力扣(LeetCode)思考:前序遍历就是根、左、右的顺序,运用递归思路,定义一个函数pretraver用于向数组中存储节点值,分别存储根节点、左节点、右节点,即采用递归方法。随后在主函数中定义空数组,调用函数pretraver。

2025-03-24 22:23:51 228

原创 代码随想录算法训练营第十一天| 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

这里要注意的问题是,可能存在多个元素出现的频率一样,这样的话,当这个频率在前k个里面时,一下就增加了多个元素,其实已经找到了k个元素了,但是统计次数还没有到k次,这样就会出错。比如,["2","1","+","3","*"],从头遍历,第一个运算符是"+",所以先计算2+1=3,其实就变成了["3","3","*"],那么接下来就是3*3=9,因此输出9。元素入队后,当队列中的元素数超过k时,就要弹出最左侧的元素,以此保证队列中最多有k个元素。150. 逆波兰表达式求值。347.前 K 个高频元素。

2025-03-22 22:57:02 326

原创 代码随想录算法训练营第十天| 232.用栈实现队列、225. 用队列实现栈 、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

把入栈的元素都给出栈后,再由出栈去pop()。理解了pop()后,peek()作用是返回队列开头元素(不是删除),队列开头元素就是第一个出队列的,也就是出栈里第一个弹出的,所以用pop()拿到这个元素的值,还要再把这个元素再放回出栈里面去(不然的话队列就少了一个元素),这里放回去直接就给出栈append了,而不是从入栈开始进入(因为这样顺序会不一致)。简化一下,就是每次出现一个左括号,就记录一个对应的右括号,这样,当相同右括号出现的时候,恰好被记录的最后一个元素也是相同右括号,才可以一起消失。

2025-03-21 23:07:50 732

原创 代码随想录算法训练营第九天| 151.翻转字符串里的单词、卡码网:55.右旋转字符串、28. 实现 strStr()、459.重复的子字符串

i的变化范围是1到n/2,每隔i个下标的字符是相同的,即s[j] == s[j-i],j的变化范围是i到n。空格问题借助Python字符串内置函数split()可以直接得到单词,并且将字符串转为了列表,之后再从列表转回字符串,使用" ".join()方法。关键在于重复,子字符串的长度为i的话,就是每隔i个下标的字符就是相同的,而且要整个数组从头到尾都满足每隔i个下标的字符是相同的。思考:一个字符串中至少要由两个相同的子字符串组成才满足题意,因此子字符串的长度可以从1到n/2。459.重复的子字符串。

2025-03-20 22:37:31 365

原创 代码随想录算法训练营第八天| 344.反转字符串、541. 反转字符串II、替换数字

所以,首先创建一个足够长度的空字符数组,然后从数组末尾开始填写字符,原数组也是从末尾开始进行遍历,逐个判断,如果是字母就直接写到新数组中,如果是数字,就要把当前下标到前面的6个位置写入number。假设数组只有偶数个元素,比如4个,["h","e","l","l"],index只需走过"h","e"就可以了,"e"下标为1,len(s)//2=2,因此需要index<len(s)//2,无需=的情况。总结一下区间的移动,其实就是每一个长度为2k的区间中,处理前k个字符串,进行反转。2、分段反转字符串。

2025-03-19 23:37:32 609

原创 代码随想录算法训练营第七天| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

当前这道题目有四个数组,如果使用四个哈希表的话,其实并没有简化问题,因此应该考虑把数组两两合并,那么是采用两个哈希表吗?本题特点是四个元素相加为0,其实又类似242题,只需要一个哈希表就行,哈希表的key代表两个数组的两个元素之和,另外两个数组元素的和要想与之相加为0,则值为-key,key对应的value值表示有几种组合使得和为value,把符合条件的value值累加到一起就是结果。思考:这道题类似上面的三数字之和,都是在同一个数组里找元素,不同之处在于三个变成了四个,而且target不固定为0。

2025-03-18 21:00:43 259

原创 代码随想录算法训练营第六天| 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

由此,可以考虑对两个记录数组相同索引位置上的元素进行乘法,只有同时不为0的位置,乘积结果是大于0的,也就是两个数组的交集,其他非交集的位置乘积一定是0。思考:首先需要思考求一个数每个位置上的数字的平方和,需要实现一个函数,利用python内置的divmod函数实现计算一个数除以10的商和余数,每次加上余数的平方,直到商不存在时,表明已经把这个数的所有位置都取出来了。两数之和,即数组中存在两个元素相加和为target,换个说法就是用target减去一个元素,得到的差也恰好在数组中,则返回减数和差的下标。

2025-03-17 22:54:44 524

原创 代码随想录算法训练营第四天| 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点 、面试题 02.07. 链表相交、142.环形链表II

因为是倒数第n个节点,所以被删除节点与链表末尾的距离是固定的,因此,构造快慢指针,让两个指针的位置距离刚好是n,这样当快指针从头结点移动到链表末尾时,慢指针刚好移动到了被删除节点的上一个节点,直接将慢指针所在节点的next指针指向下下个节点即可。看了题解后,理解了最简单的办法,先求两个链表的长度(如果有交点,则肯定末尾有一段是相同的),长度较长的链表前面肯定不同,因此长链表指针先移动它比另一个链表多出来的长度后,再开始两个链表指针同步移动,每次移动一步,直到两个指针所在节点相同时,这个节点就是交点。

2025-03-15 13:58:53 683

原创 代码随想录算法训练营第三天| 203.移除链表元素 、707.设计链表 、206.反转链表

思考:反转链表,就是要让每一个节点的next指针都指向前面的节点,且翻转后的链表最后一个节点要指向空节点。因此,这就需要一个tmp节点预先存储当前节点的下一个节点,以便cur的next指针指向pre后,pre可以移动到cur的位置,cur可以切换到下一个位置,直到cur来到原始链表的最后一个节点的后方,即空节点时,循环结束。功能主要分为:1、获取下标为index的节点的值;思考:链表每个节点都有next指针指向下一个节点,要删除一个节点,只需要把指向这个节点的指针,指给本节点的下一个节点即可。

2025-03-14 23:53:18 295

原创 代码随想录算法训练营第二天| 209.长度最小的子数组、59.螺旋矩阵II

思考:一个字,不会写。以前在力扣有刷过,很久了,当时也没记住。这道题需要思考旋转的路径,分段处理,每段的边界值都需要特殊考虑,还有矩阵最中间的值。仔细看代码其实还是很有规律的,按照旋转顺序分成上->右->下->左四个部分,需要注意的是循环的条件和x,y坐标如何表示。思考:这道题一般第一次写都可以写出来一部分代码,但是好多细节容易处理不好,1、循环的条件设置;2、左右指针的移动,sum何时加右指针的值,何时减去左指针的值;其实真正有效的代码都很简单,自己写就总是越写越多,要做到逻辑清晰太难了。

2025-03-13 23:55:38 176

空空如也

空空如也

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

TA关注的人

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