自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【代码随想录算法训练营第四十三天|卡码网52.携带研究材料、18.零钱兑换II、377.组合总和Ⅳ、卡码网57.爬楼梯】

这题是完全背包问题,完全背包问题在01背包问题的基础上其实主要是三个不同,第一个是初始化的时候不能再和01背包一样对第一个物品让背包大小大于物品重量的时候全部初始化为物品价值,因为现在的物品可以无限放。第二个就是动态规划内部的循环推导的时候不用倒序而是正序了,因为之前提过正序会导致物品的重复使用,而现在正好是要重复使用。还有一个就是内外循环现在是可以交换的,只要保证dp前面的状态先于后面的状态计算出来就可以。其实这一题实际上要求的是排列,也就是上一题提到的背包在外的循环方式。

2024-06-19 10:36:13 178

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

先把每个字母的1和0的个数求出来,然后创建一个(m+1)*(n+1)的dp数组,第一个维度表示0的个数,第二个维度表示1的个数。然后对每个物体进行遍历,再对m和n倒序遍历,寻找dp[i][j]和dp[i-num[0]][j-num[1]]+1中的最大值。的时候都不可能实现,返回0。这里dp[i]数组表示的是和为i时的可能路径数,初始dp[0]可以看作是和为0且没有数字可以选择的时候,初始化为1,路径数是dp[i]已经有的路径加上选择数字num时的dp[i-num]的路径数。

2024-06-18 12:16:59 190

原创 【代码随想录算法训练营第四十天|卡码网46.携带研究材料,416.分割等和子集】

但是这样就必须要先物品后背包(不然一直都是同一个物品(物品1)在遍历),然后在遍历背包的时候还要注意只能倒序遍历,如果正序的化,前面的数据如果已经添加了该物品,则会重复添加(因为二维dp的时候用的时上一层的数据,不会出现覆盖而重复添加)。dp数组[i][j]前一位表示的是物品的种类,后一位表示的是背包的容量,在物体为i时,容量为j的背包的最大价值由不放入i的。中的最大值所决定,当然这是在容量大于spaces[i]时才能实现,小于spaces[i]的时候则只能维持。所以如果数组总和为奇数直接返回False。

2024-06-17 19:52:11 162

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

dp内容是值为i的时候的二叉搜索树的可能个数,值为i时,他可能的二叉搜索树是从1到i的所有元素作为根节点的树相加的,对于每一个作为根节点的元素j,他的可能搜索二叉树由小于j的元素[j-1]的dp值构成左子树,由大于j的元素[i-j]的dp值构成右子树,则根节点为j的树的dp值为左右子树的dp值相乘。dp是每个各自的路径的和,每个格子的路径是左边格子和上边格子的和。这里初始化的时侯假设所有格子都只有一条路径,然后遍历所有格子,如果i-1和j-1大于0则可以把对应格子的值加上。

2024-06-15 14:47:22 246

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

dp数组定义为爬到对应楼层的最小花费, 楼层一共有len(cost)+1层,因为可以从0或者1层起始,所以dp[0]和dp[1]都是0,传递函数是前两层的dp加上对应的cost之后的最小值。这里不用递归的方法,用动态规划的dp数组来存储每个n的斐波那契数,然而最后只需要返回n的斐波那契数,所以只保存最近的两位斐波那契数就可以了。和斐波那契基本一样,n层的状态是n-1和n-2层的合,区别是只有n=1开始有意义,同样也可以只保留两个最后的状态。

2024-06-15 11:46:12 238

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

另一种从前往后,找到当前值大于后面值的就设置当前索引为flag,然后需要判断前值是否与当前值相等,一直要找到第一个相等的值的位置,让这个位置的值-1,并把flag设置在那个位置,然后把flag及后面的值都赋值为9.先按照右边界对数组排序,然后判断前一个区间的右边界是否大于该区间的左边界,大于的话就说明上一个区间的右边界在该区间内,两个区间有交集,因此把两个区间取成交集后再放回数组中,如果区间没有交集那就放到输出中。

2024-06-13 14:35:24 352

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

先把每一个位置上的字母计算出它出现的最远的位置,然后遍历字符串,设置左边界和右边界,如果字符串的最后出现位置大于现在的右边界,则把右边界重新设定为该位置,如果当前位置就是右边界,则把左右边界内的字符串就是一个分割,左边界重设为右边界+1。如果后一个气球的左边界小于等于上一个气球的右边界,那么就可以同时被一箭射爆,因此可以把这个气球和上一个气球看成新的个体,其右边界为两个气球的最小右边界,再去和下一个气球进行判断。

2024-06-13 10:33:00 153

原创 【代码随想录算法训练营第三十五天|1005.K次取反后最大化的数组和、134.加油站、135.分发糖果】

把数组先排序,排序好后根据k和数组长度中最小的那个进行遍历,目的是如果有负数的就把他们从小到大依次取正,然后按照还剩下的k的数量来判断,如果是偶数则按照当前数组输出,如果是奇数则需要把当前数组的最小值取反再求和。第二次是从右往左,如果左边的分大于右边的,如果左边的糖果本来就大于右边的则不变,否则变成右边的+1。假设从0出发,保证每一次加完油跑到下一个站点时油量大于等于0,如果油量小于零了就把启示站移到下一个加油站,如果总的gas和小于cost的和那怎么都是不能跑完全程,返回-1。

2024-06-12 17:47:08 161

原创 【代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II】

从前往后正推,每次走到当前的最大范围了就step+1,范围变成下一个最大范围。只需要遍历到倒数第二个元素,最后一次走到倒数第二个元素就不用判断是否走到了当前的最大范围了。我是从倒数第二位开始看,如果下标+可以跳跃的长度大于等于最后一位下标,则把它的下标看作新的目标,往前依此类推,最后看最小符合要求的下标是否为0。想了一个用回溯的方法做的,但是超时间限制了,但如果是要所有可能路径+step的话可以这样做。计算相邻两天的利润,如果是正的就加到结果里,负的就扔掉。还是从后往前倒推来做的一种方法。

2024-06-12 11:22:19 237

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

如果相邻梯度相乘为负数,索引+1,否则把这个元素删除,最后剩下的元素个数如果大于2那就返回这个长度,如果只剩下两个元素则需要看是两个相等的元素还是不等的(至少会返回两个元素),相等返回1,否则是2。count用来计算连续数组的和,当count<0的时候就需要将前面的抛弃掉,否则就继续累加,最终返回最大的count。优先保证胃口最大的分到能满足要求的最大的饼干,所以要先对胃口和饼干排序,然后给胃口最大的喂能满足的最大的饼干。

2024-06-07 15:24:15 211

原创 【代码随想录算法训练营第三十天|332. 重新安排行程、51. N 皇后、37.解数独】

在回溯的时候,是查看每一个机场是否还有可以飞的机场,如果没有的话就说明他是目前的最后一个机场,把他添加到结果中,如果还有机场的话则把这个机场pop出列表,进入递归。因此结果中的机场的添加顺序和最终返回的顺序是相反的,因此在做机场的配对的字典的时候需要根据字母的顺序反向排序机场,这样在输出的时候再一反序就是需要的答案。出发机场和到达机场之间的关系就是一组键值对,因此先用一个字典创建出每个机场可能到达的机场的键值对,每个机场对应一个可以到达的机场的列表。

2024-06-07 13:30:12 203

原创 【代码随想录算法训练营第二十九天491.非递减子序列、46.全排列、47.全排列II】

和上一题相比,需要对给定的数组先排序,然后根据相邻位置的是否相等来判断有没有在这一层使用过这个数,如果相等并且pre为False说明在这一层已经使用过了,直接跳过,别的一样的。因为给的数字中元素不会重复,所以再做一个数组存放每个元素使用过的信息,如果没使用过就添加到path,最后path和原数组长度一致的时候添加到ans里。因为给的数组的顺序是不确定的,所以在每一次的递归中都要用一个集合来存放本层使用过的数字,后面出现同样的数字就跳过。

2024-06-05 10:56:58 284

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

主体部分是做一个循环,因为ip每一位最多三个数字,所以可以取1~3个字符出来,取出来之后做判断这个数是否符合要求,如果是0则直接跳过取别的数目的字符,直接进入下一步的递归,索引+1,ip位置也加一,如果数字大于255则跳过这个可能。回溯的条件是ip位置大于3,或者索引大于等于字符串的长度,在索引等于字符串长度并且ip位置刚好为3的时候把这个ip添加到输出结果中。回溯函数有四个参数,第一个是字符串,第二个是目前在字符串中的索引开头位置,第三个是目前的ip位置,第四个是已经放入ip的字符串。

2024-06-04 11:15:51 181

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

不知道说啥,但总得写点什么吧。和上一题相比排序去重一下就行。

2024-06-03 14:48:00 174

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

和给的代码写的不大一样,但思路基本一致。怎么感觉回溯的套路都一样的。

2024-06-03 13:31:51 151

原创 【代码随想录算法训练营第二十四天|回溯算法:77.组合】

记住回溯算法的模板还是很好写出来的。

2024-05-31 15:43:46 114

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

迭代的比较麻烦,一开始要对根节点额外处理(因为根节点没有前置结点),如果根节点数值大于左边界则直接取右结点(左子树的值一定都小于根节点),大于右边界同理。然后再从移动后的根节点开始,对根节点的左右子树做删减,如果左结点值小于左边界,直接指向左结点的右子树,并且一直向左下角迭代,直到最左下角的值也大于左边界,右结点同理。返回条件有三个,当走到None的时候直接返回,如果结点的值小于左边界,则返回结点的右结点,但是右结点也可能有小于左边界的值,因此实际返回的是进入递归修剪后的右子树;

2024-05-30 11:37:45 127

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

在普通二叉树的最近公共祖先的基础上,现在知道了二叉树的大小顺序,可以拿当前结点的值和目标比较,如果一大一小则当前结点就是最近公共祖先,如果同时大或同时小则要让右结点或左结点进入递归寻找。5:结点存在,且左右子树存在,可以对右子树遍历左端,将左子树放置于右子树的最左下端(因为左子树的所有值均小于右子树的最小值),再用右子树的根节点替换原结点。3:结点存在,并且右子树存在,左子树不存在,直接用右子树的根节点代替原结点。4:结点存在,并且左子树存在,右子树不存在,直接用左子树的根节点代替原结点。

2024-05-29 12:31:09 181

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

从根节点开始,分别对左右结点判断p或者q是否在这个子树里面,如果在的话就返回这个结点,如果直到None都没找到p或者q那就返回None,如果左右子树都有p或q在子树里就返回当前节点,否则返回有p和q的那个子树里的最近公共祖先。中序遍历,这样二叉搜索树的结果就是一个从小到大的有序数组,具体递归的时候只用记录下前一个结点做差值和最小值比较就能找到最小绝对差。中序遍历的时候和前一个结点比较,如果相同则计数加一,计数值超过最大数则清空输出并赋值,如果计数值和最大数相等则添加到输出。

2024-05-28 13:08:02 230

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

以第一颗树为基准,如果root1不存在但root2存在,则直接把root2拼到root1的位置,如果root1和root2都存在,则root2的值加到root1上,然后再对root1合左右子结点进行递归。递归的时候按照中序遍历的顺序,设定一个最大值,如果按照中序遍历的顺序那么每一个根节点都应该大于之前的最大值,如果小于之前的最大值则就返回False。利用中序遍历递归把二叉树变成一个左中右顺序排列的数组,如果数组是递增的,是正确的。找到最大的数的索引然后左右分别放入左右子树递归,

2024-05-27 19:44:01 211

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

在中序遍历的数组里面看不出任何顺序,但是后序遍历里面,最后一个元素一定是当前子树的根节点。找到当前子树的根节点之后,就可以根据这个值在中序遍历里面找到左右子树的切分区,又因为左右子树的大小是一样的,所以根据中序遍历的切分又可以把后序遍历的数组也切分了,这样就又化为对左右两个子树的一次递归。因为只需要找到一个符合要求的路径就返回True,所以不需要遍历所有的根节点到叶子节点的路径,只需要按照前序遍历的方式来寻找到叶子路径,判断是否路径和满足条件,如果不满足则对存在的左右结点再进入递归判断。

2024-05-27 16:22:26 403

原创 【代码随想录算法训练营第十七天|110. 平衡二叉树、257. 二叉树的所有路径、404.左叶子之和】

当结点左右子结点都为None的时候就是路径到头了,需要返回,否则就将当前路径传入到下一个左结点或者右结点中,在传入子结点的时候路径会被添加上子结点,所以在返回到当前结点之后要把这个值给pop掉。首先要把root为None和root没有左右结点的情况都返回0,然后对左结点做一次判断,如果左结点就是左叶子结点,那么左结点就不进迭代,直接将左叶子的值赋上,否则就把左结点进入迭代,右结点直接进迭代(他不可能是左叶子),然后返回左右结点的左叶子和。

2024-05-23 23:45:29 348

原创 【代码随想录算法训练营第十六天|104. 二叉树的最大深度、559.n叉树的最大深度、111. 二叉树的最小深度、222.完全二叉树的节点个数】

判断满二叉树只需要在这个结点开始,沿着左结点和右结点分别一起往左右下移,如果最后两边下探到None时的深度相同,那么这就是一个满二叉子树,结点总数是2^dep -1,否则就正常进入递归,结点总数是左结点子树的结点数+右结点子树的结点数+1。在这里用前序遍历后序遍历都行,前序遍历的话求的是结点的深度,后序遍历的话求的是结点的高度(深度是从上往下,高度是从下往上的),根节点的高度就是二叉树的最大深度。层序迭代遍历的方法在昨天做过了,今天就用递归的方法来做。同样迭代法昨天做过了,今天做递归的。

2024-05-23 11:30:21 269

原创 【代码随想录算法训练营第十四天|102. 二叉树的层序遍历、107. 二叉树的层序遍历 II】

对左右子结点分别判断,先判断左右对应位置的子结点有None或者都为None的情况,然后如果左右子结点值不同就返回,值相同就以他们的左右结点再进行一次递归比较,比较的时候先外侧再内侧,全都相同的话返回True。这里就用层次遍历的方法了,层次遍历的时候判断一下结点是否为None,因为None也需要放进来考虑,不然会存在单层不是镜像列表反转后也相等的情况。在层序遍历的时候,记录一下前置结点,如果有前置结点就让他指向现在的结点,每层遍历完的时候的最后一个结点指向None。把对左右子结点的判断变成对子结点的遍历。

2024-05-22 15:31:19 239

原创 【代码随想录算法训练营第十三天|144. 二叉树的前序遍历、94. 二叉树的中序遍历、145. 二叉树的后序遍历】

因为中序遍历的时候,访问的结点不是第一个需要处理的结点,所以需要一个栈用来保存中间结点,一个指针来指向当前访问的结点。当当前访问的结点不为None的时候,将结点入栈,然后指向当前结点的左结点,如果为None,则把栈顶结点出栈,将其元素添加到输出列表中,然后再让指向当前结点的右节点。二叉搜索数是有序的,在二叉搜索树里,左子树的值都必须小于根节点,右子树的值都必须小于根节点,并且子树里也满足这个要求。后序遍历是左右中,在前序遍历中左右的基础上,把左右结点入栈的顺序调换就是中右左,再把输出反转就是左右中了。

2024-05-21 21:26:35 249

原创 【代码随想录算法训练营第十二天|239. 滑动窗口最大值、347.前 K 个高频元素】

最大值,因此可以把每个列表做一次简化把不会被用来参与最大值比较的值抛去,把列表里的值依次放入一个队列中,队列的头放的是当前列表的最大值,后面的值也都按照从大到小的顺序,如果后放入的值大于队列目前的尾,则把尾数据出队列。在滑动窗口滑到下一个位置的时候,要判断当前出队列的值是不是队列的最大值(也就是队列的第一个元素),是的话则把该值出队列。对统计完频率的哈希表中的元素进行遍历,根据值的大小写进最小堆中,如果堆的长度大于k就把堆顶pop掉,就排除了目前的最小频率,遍历完之后留下的k个元素就是出现频率最高的k个。

2024-05-20 14:37:51 746

原创 【代码随想录算法训练营第十一天|20.有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值】

判断为False的条件1:右括号的前一个括号不是对应的左括号或者没有左括号了,2:右括号全部匹配完之后还有多余的左括。把所有前置没有被匹配的左括号做成栈,先进后出与右括号匹配,按照上面的判断条件判断即可。创建一个空列表(栈),输入一定是两个操作数搭配上一个运算符号,所以如果是数字就append进列表,遇到运算符就把这两个操作数出栈然后把运算结果入栈。创建一个空列表,然后遍历字符串,如果栈不为空栈顶(列表末尾)的值和当前字符相同则把这个值从列表中出栈,否则就添加到栈顶。

2024-05-19 19:59:55 115

原创 【代码随想录算法训练营第十天|232.用栈实现队列、225. 用队列实现栈】

队列出的时候把栈反过来出栈保存一遍就完事了,大体上把对列的进队尾用入栈实现,出队列的时候把现有的在出队列的部分出完之后,再把入栈的部分转进来等待出队列。今天的题目用python实现的话太没意思了,不如掏出C++。(看惯了python的几十ms看c++真的好快啊)代码随想录里用两个队列实现的,也可以不用两个队列,直接在这个队列上操作。pop的时候把队列头补到队列尾部,做。同理,就是要多做一次把头再放回尾部。次,留下来那个队列的头就是栈的顶,

2024-05-17 15:02:57 165

原创 【代码随想录算法训练营第九天|28.找出字符串中第一个匹配项的下标、59.重复的子字符串】

感觉python字符串除了不能够修改别的和列表区别不大,基本上也都是转成列表来做的,双指针法一样用,主要是这个KMP的next数组用处比较大,在字符串里找字符串的时候都可以用到。

2024-05-16 11:48:09 334

原创 【代码随想录算法训练营第八天|344.反转字符串,541. 反转字符串II,卡码网54.替换数字,151.翻转字符串里的单词,卡码网55.右旋字符串】

要么用python切片直接加起来,要么自己写一个两次反转的,先整体反转然后分别反转前n个和后面的部分。比较左指针小于右指针都可以,遍历因为不需要在每次循环的时候做判断会更快一点。创建一个空列表,判断输入字符串中的元素是否为数字,是数字就在列表中。和上面一题基本一样,就是多了一个反转条件的判断,定义一个指针。成单词,然后用双指针反转单词的位置。函数反转列表然后再赋值回去,但是。函数返回的是一个迭代器,因此要用。成单词后再逐个反转单词,并用空格。的最小值,反转其中的部分。直接在列表上反转,或者用。

2024-05-15 12:00:57 300

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

分成两组,每组数组所有元素的和的可能值做成一个哈希表就可以看作是一个两数相加了。第二个字符串做成哈希表,然后第一个字符串去找,找到了值减一,没有找到或者值为0就返回False。减去第二组元素的和往第一组的哈希表里找,找到了就把对应的出现次数加到总数上去。先排序,然后把第一个数提出来遍历数组,然后用双指针把剩下的数组用。上午写完了没保存,忙了一天晚上才发现,心态大崩:)选第一个数的后可以算出最大和最小可能和来和。减去第一个数的值当作两数之和来做。比三数之和再多一个嵌套,一样的。这题我必不用哈希表,想的头疼。

2024-05-14 21:30:27 178

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

思路都是先统计第一个字符串的所有字符和对应的个数,然后用第二个字符串去比较,如果字符出现在第一个字符串的字典里面,对应的值就减1,否则直接返回False(因为有不一样的字符了)。因此把所有可能的各位平方和存储为一个集合,判断每次计算出来的值是否为1,为1则输出为快乐数,否则进入集合中看是否存在,存在则不是快乐数,不存在则添加进集合中。不直接把原数组直接变成字典是因为,题目要求的是数组下标不能是相同的,但是可以是相同的数值,如果直接把数组变成字典就没法处理。python集合本来就可以直接计算交集并集和差集。

2024-05-13 10:39:51 405

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

电脑没电了不写了(垃圾幻14只能续航不到两小时,回家没带电源线,一个半小时极限做完),链表还是双指针比较重要感觉。

2024-05-11 11:47:37 402

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

这题的关键就是虚拟头节点的使用,如果不用虚拟头节点的话,头节点需要另外处理,而使用虚拟头节点可以让所有节点一视同仁更加方便。虚拟头节点尾部指向原来的头节点,并且设置一个temp节点初始指向虚拟头节点,如果temp节点尾指向的节点存在,则判断与目标值是否相等,相等则让temp节点的尾部指向temp的next的next,否则temp指向temp的next。

2024-05-10 10:49:42 158 1

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

数组比较重要的感觉就算双指针法,别的都可以看作是双指针法的衍生。

2024-05-09 11:21:36 156

原创 代码随想录算法训练营第一天 | 704. 二分查找 、27. 移除元素

快慢指针,慢指针指向新数组的末尾,快指针遍历整个数组,如果快指针找到了对应的值,则跳过,否则把快指针的值赋值到慢指针指向的位置并且两者同时加1。使用二分查找,不同处在于如果值不存在于数组中需要返回其插入的位置。在二分查找结束之后多一步比较,在这里使用左闭右闭的写法,如果。双循环,找到值后把后面数组全部往前移一位,同时数组长度和第一个循环的索引减一。是一定无法取等号的,所以改变范围的时候需要对其减一。,如果和左闭右闭一样的话则一开始就舍弃了数组最右边的值。关键在于区间的选取,可以选择左闭右闭或者左闭右开。

2024-05-08 09:51:59 263 1

空空如也

空空如也

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

TA关注的人

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