自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法训练总结篇

动态规划是这阶段学习时间最长的一部分,除了前半部分学习的背包问题和完全背包我们,在后面我们还学习了处理组合数和排列数的情况,我们需要明确的是:如果求组合数就是外层for循环遍历物品,内层for遍历背包。哈希表中无非涉及三种类型的情况:1.遇到字母组成的哈希问题,我们可以考虑使用char[]数组来解决,2.set做哈希表,这种情况下我们一般要判断这个数值是否存在,3.map做哈希表,这种情况下我们不仅要判断是否存在,还要返回对应下标。栈与队列实际上并没有过多难题,主要就是在于理解题意会使用栈和队列即可。

2024-01-10 18:20:23 509

原创 算法训练第六十天|84.柱状图中最大的矩形

本题整体思路实际上和上一题接雨水的思路是一样的,唯一不同的是接雨水我们希望求比当前柱子更低的柱子,而本题我们要求更高的柱子,所以在单调栈判断入栈上的处理上不同,即heights[i] > heights[st.peek()]时,当前元素入栈。

2024-01-06 22:09:24 467

原创 算法训练第五十九天|503. 下一个更大元素 II、42. 接雨水

本题实际上和下一个更大元素Ⅰ那题思路是一样的,唯一的区别在于我们要考虑循环的问题,我们可以通过2*nums.length来扩大遍历的次数,再通过取模的方式来实现更新。接雨水这题因为我们要考虑的是凹槽的空间,所以实际上我们只要找到下一个比当前柱子大的柱子即可,所以本题本质上和前面考虑的问题是一样的,同时用int h = Math.min(height[left], height[index]) - height[mid];来计算当前存储的高度,最后加入sum中即为最终结果。

2024-01-05 22:07:43 554

原创 算法训练第五十八天|739. 每日温度、496. 下一个更大元素 I

本题是单调栈问题的第一题,单调栈则存在单调递增和单调递减两种情况,本题我们可以根据题意,发现我们要求的应该是比栈顶还大的,所以实际上从栈底到顶是个递减的栈,当 当前元素比栈顶小的时候我们入栈,如果大的话我们循环遍历出栈,并记录结果。本题实际上类似于每日温度那题,我们可以用一个map去存储nums1这个数组,再遍历nums2,这样就变成了每日温度一样的问题。

2024-01-04 18:26:11 504

原创 算法训练第五十七天|647. 回文子串、516.最长回文子序列

本题求回文子串的数量,所以我们dp的设定可以设计为i,j中间是否是回文串,当chars[i] == chars[j]成立时,我们存在1.i=j,只有一个字符,例如:“a”,2.|i-j|=1,两个字符"aa",前两种都是成立的,我们需要主要考虑第三种情况:相差不止是1,例如:“abcba”,则我们需要根据他的子串的情况判断,则dp[i + 1][j - 1]需要为true。

2024-01-03 21:00:57 406

原创 算法训练第五十六天|583. 两个字符串的删除操作、72. 编辑距离

本题类似于先前做过的最长公共子序列,我们可以用求公共序列的方式推出要删除的数字,dp设计为最长公共子序的长度,所以当word1.charAt(i - 1) == word2.charAt(j - 1)成立,我们进行+1,不同时取dp[i - 1][j]和 dp[i][j - 1])更大的部分。

2024-01-02 20:40:43 425

原创 算法训练第五十五天|392. 判断子序列、115. 不同的子序列

判断子序列这题实际上类似于前面做过的最长公共子序列,不同是我们可以把s这个子序列假装成公共的子序列,这样我们在遍历结束只需要判断是否和s长度相等即可。本题主要要理解dp的含义,本题的dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。我们可以把dp推导公式理解成 j-1 结尾的子串在当前位置和不在当前位置的情况,所以可以得出 dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];

2024-01-01 21:52:14 405

原创 算法训练第五十三天|1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

本题类似于昨天做的最长重复子数组,但不一样的是那题要求是连续的,本题并没有对连续做限制,则意味着在递推公式处理时并不一样,相同时处理逻辑是一样的,但在不相同时我们可以对dp进行dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);处理,即将两个子串前一个更大的赋值给dp本题我们可以根据题意分析出来,本质上实际上就是一个最长公共子序列的变式,通过同样的套路求解即可。

2023-12-30 19:37:02 389

原创 算法训练第五十二天|300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

本题因为涉及两层递归,外层的递归,和内层的递归(存在每个元素并不是相邻的情况),则我们在循环遍历的时候应该考虑两层循环,并判断nums[i] > nums[j]的情况即可。本题因为是连续递增的序列,所以相比于上一题要更简单一些,我们可以直接使用dp的值和max的值对最大值进行一个记录即可。本题是两个数组,同时考虑重复的问题,则我们可以使用一个二维dp数组,存储每一种数组组合的情况,则有int[][] dp = new int[nums1.length + 1][nums2.length + 1];

2023-12-29 21:59:24 756

原创 算法训练第五十一天|309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费

含冷冻期的问题,我们可以将dp数组考虑二维,而分为0,1,2三个参数分别表示卖出股票,买入(持有)股票和没有股票(含冷冻期),则通过这三个参数,咱们可以写出各自的推导公式并求出最后的值。含手续费问题实际上我们只需要在遍历的过程中考虑到手续费因素影响的卖出最大值即可,其余思路可以参考前两天的股票问题。

2023-12-28 21:45:55 415

原创 算法训练第五十天|123. 买卖股票的最佳时机 III、188. 买卖股票的最佳时机 IV

本题重点在于定义dp的含义,本题因为要考虑卖出买入的问题,所以我们可以设置dp二维数组第二个长度为5(0: 没有操作, 1: 第一次买入, 2: 第一次卖出, 3: 第二次买入, 4: 第二次卖出),再根据dp的定义写出推导公式。本题类似于买卖股票的最佳时机 III,但我们需要考虑k次的问题,可以按照买卖股票的最佳时机 III的思路,在第一个for循环中再进行第二个for循环的嵌套,遍历将k的值赋入,其余思路类似于买卖股票的最佳时机 III。

2023-12-27 21:47:07 396

原创 算法训练第四十九天|121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II

买卖股票Ⅰ最关键的问题是股票如何只保证操作一次,所以我们可以考虑用两个参数0和1,0代表未持有股票,1代表持有股票,则我们可以得出dp[0]和dp[1]的推导公式。买卖股票Ⅱ本题相比于Ⅰ来说可以买卖多次,所以相比于持有的状态,我们更应该关注利润的大小,所以我们可以将dp设置成利润,而dp[i-1] + prices[i-1] - prices[i-2]就是卖出后的利润,dp[i-1]是不卖的利润。

2023-12-26 20:18:26 464

原创 算法训练第四十八天|198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III

打家劫舍Ⅰ问题比较基础,就是考虑每个之间的间隔,我们取i-3和i-2之间更大的值,将其加入dp数组中即可。打家劫舍Ⅱ涉及到头尾之间的问题,则本题我们可以考虑去掉头去掉尾,不认识对一个数组中0,n-2进行打劫Ⅰ的思路处理,再对1,n-1做同样的处理,处理结果进行一次最大值比较就是最终的结果。打家劫舍Ⅲ是一道树形的动态规划问题,根据题意我们可以知道,我们要判断每个结点是否可以遍历,则我们可以设置 int res[] = new int[2];

2023-12-25 21:45:40 1881

原创 算法训练第四十六天|139. 单词拆分

单词拆分这题本质上也是动态规划的完全背包问题,我们把单词表看作是可以选择的物品,而组成的单词看作是背包容量, 同时根据题意我们能发现本题的顺序是影响结果的(即是排列问题,目标在外,物品在内)递推条件我们满足dp[j]是true同时j,i的子串在单词表中,即可以让dp[i]是true。

2023-12-23 20:21:43 380

原创 算法训练第四十五天|卡码网57. 爬楼梯、322. 零钱兑换、279.完全平方数

本题实际上本质上是一个完全背包问题,本题要求的是排列数量,所以外层循环是目标值,内层循环是存放的物品,但是本题要求的m是从1开始的,所以我们要在循环过程中判断是否成立。零钱兑换问题本质上也是一个完全背包问题,唯一的区别是本题要求返回的是 最少的硬币个数 所以我们要求在初始化的时候设定dp为Integer.MAX_VALUE(确保在min求最小值的时候不会受到影响)完全平方数本题类似于前面的零钱兑换问题,唯一区别就是第二层循环遍历的是i*i(完全平方数)同时初始化也需要设置最大值。

2023-12-22 21:13:16 450

原创 算法训练第四十四天|卡码网52. 携带研究材料、377. 组合总和 Ⅳ、518. 零钱兑换 II

完全背包问题不同于01背包在一维数组上的区别是01背包问题我们必须要使用倒叙来保证每个元素只被使用一次,而完全背包可以使用多次,我们就不需要用倒叙来实现。本题因为是组合问题,我们需要考虑每个元素出现的顺序(例如1,2,3和3,2,1视为两种组合)则我们需要注意的是背包容积和物品数量的循环遍历顺序,我们的容积应该是在外层遍历,而数量在内层遍历。本题的零钱兑换本质上就是一个排列数问题(因为不考虑数字顺序)所以我们的遍历顺序应该是外层是物品的数量(即钱币数量)内层是最大容积(即目标金额)。

2023-12-21 21:24:41 422

原创 算法训练第四十三天|1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

最后一块石头本题根据题意我们知道要切分每块石头(石头之间是两两配对的)所以我们不难发现,如果总和的一半恰好是一堆石头的重量则为最优情况,所以本题本质上和昨天的规划问题思路类似。目标和要求我们求出最终目标,所以我们可以根据最终目标,再根据总和求出正数的和,即是我们背包问题中的背包空间,本题的dp[i]表示为方法数量,那么在我们递归nums[i]的过程中dp[i]也应该是变化的,则有递推公式: dp[j] += dp[j - nums[i]];

2023-12-20 21:11:41 497

原创 算法训练第四十二天|卡码网46. 携带研究材料、416. 分割等和子集

本题本质上是一个01背包问题,我们在本题中把背包的价值和容量都看作为数组中的每个数字,再仿照基本的背包问题公式即可求解。

2023-12-19 21:10:49 428

原创 算法训练第四十一天|343. 整数拆分、96. 不同的二叉搜索树

本题主要思路在于拆分的思路,j*(i - j) 是单纯的把整数拆分为两个数相乘,而 j×dp[i - j]是拆分成两个以及两个以上的个数相乘。所以关于dp的推导公式就是 dp[i] = Math.max(dp[i], Math.max(j*(i-j), j*dp[i-j]));通过两个for循环可以求出最终值。

2023-12-18 21:44:22 473

原创 算法训练第三十九天|62. 不同路径、63. 不同路径 II

不同路径这题我们只需要考虑每一行每一列的的条数,最后遍历到后面即是最后的结果,注意:我们要先初始化每一行每一列为1条路径。不同路径Ⅱ这题要考虑到障碍物问题,所以我们可以在遍历过程中遇到障碍物(即:obstacleGrid[i-1][j-1]==1)的情况我们设置dp值为0(即当前位置没有方案能到达),最后照常遍历即可。

2023-12-16 20:05:28 1253

原创 算法训练第三十八天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

斐波那契数列这题我们可以通过题意推出dp关系式, dp[i] = dp[i-1] + dp[i-2],通过这个关系式我们可以求出每个dp的值(本题的dp表达为第n项的值)爬楼梯这题和斐波那契数列很相似,我们只要考虑i-1的情况数量和i-2的情况数量(即两个阶梯跳两格到当前位置和一个阶梯跳一个到当前位置,两者相加即为数量)

2023-12-15 19:47:55 391

原创 算法训练第三十七天 |738.单调递增的数字、968.监控二叉树

本题根据题意可以知道,遍历过程中我们只要找到最低位置需要改变的数字,将他变成9即可,所以我们用start作为题目标记,提供比较记录,将start后面的数字都变成9即可。本题我们只需要考虑摄像头和结点的覆盖关系即可,一个摄像头可以覆盖两个结点,我们设置0为无覆盖,1为放置摄像头,2为有覆盖,罗列出某种情况并进行处理即可。

2023-12-14 20:17:55 382

原创 算法训练第三十六天 |435. 无重叠区间、763. 划分字母区间、56. 合并区间

无重叠区间问题实际上和昨天的射气球问题很像,我们可以用同样的思路,但这一次考虑的是不重叠的部分,如果遇上不重叠的部分我们更新区间,最后用所有的区间减去当前区间即是最终答案本题与重叠有一部分类似但并不是特别一样,先是整体遍历字符串记录最后一次出现的位置在edge中, 每次遍历将idx更新,当遇到i和idx相同的情况则记录一次,最后结果就是所求答案。

2023-12-13 21:42:12 414

原创 算法训练第三十五天 |860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球

柠檬水找零这题咱们只需要设计出存储5块,10块的情况,在消耗零钱的时候进行统计并在下一次找零进行判断即可。本体涉及两个因素,一个是位置的先后,还有一个是身高的先后,我们在处理这种问题的时候应该先考虑一个方面(例如本题先根据身高进行排列),第二次排列我们再根据顺序进行判断即可得出结果。本题的贪心思路主要是射击气球过程中我们只要射击重叠最多的气球即可,如果发现两个气球不是重叠的我们对箭的数量进行一个添加,如果是重叠的,我们需要更新最小右边界(当前这根箭射出去的位置)

2023-12-12 20:49:15 402

原创 算法训练第三十四天 |1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果

k次取反,我们通过理解容易考虑出若想要最终的求和结果最大,我们翻转的应该优先是负数,当所有负数被翻转后我们只要找到最小的正数即可。加油站这一题我们实际上需要关注的只有gas和cost之间的差值即可,并对每天的差值进行求和,如果所有的差值总和都小于0,那么我们不能求出结果返回-1;如果在遍历过程中部分和已经重新小于0的情况,我们从下一个索引开始遍历分发糖果这题我们需要注意的一个点是“相邻两个孩子评分更高的孩子会获得更多的糖果”。

2023-12-11 21:10:06 397

原创 算法训练第三十二天 |122. 买卖股票的最佳时机 II、55. 跳跃游戏、45. 跳跃游戏 II

本题考虑股票买卖问题我们容易被题目中所描述的买卖时间所误导,我们应该可以将买卖的情况分开考虑(如第一天买,第三天卖可以看作第一天买第二天卖,第二天买第三天卖)通过这个思路我们可以列出Math.max(prices[i] - prices[i - 1], 0) 这样一个式子,即我们只要求出每天的买卖情况即可。跳跃游戏这题我们需要判断是否能到达终点,则我们只需要关注所覆盖的范围即可,每次循环遍历扩大覆盖范围,当我们覆盖范围达到最大范围的时候,即可以到达最终点。

2023-12-09 18:39:04 327

原创 算法训练第三十一天 |455. 分发饼干、376. 摆动序列、53. 最大子数组和

今天开始贪心算法章节,贪心算法重点在于对题目的分析理解,本题要求分饼干则我们的目标就是让大饼干尽可能的分给需求大的人,小饼干给需求小的人,所以我们可以先进行一个排序,后通过遍历饼干的规格将其分发给小朋友。本题不难发现,实际上摆动数组我们只要关注两个数字之间的波动变化即可,所以根据这一点我们设计了bef(前一次变化)和cur(本次变化)并遍历数组去比较每次变化,当满足条件时我们对结果进行一次+1,最后求出答案(注意因为本题求子序列长度我们默认值为1)

2023-12-08 20:46:49 389

原创 算法训练第三十天 |332.重新安排行程、51. N皇后、37. 解数独

重新安排行程问题实际上是一个深度搜索问题,但是放在回溯问题中让我们考虑回溯算法求解的方法,我们先是通过一个map映射了飞机航线的路程,再在回溯的判断中对映射的map进行处理n皇后问题本身思路并不难理解,但我们需要将每个棋盘做对应的判断处理,使得本题变得更加复杂,通过isValid函数我们可以判断棋盘的棋子是否存在皇后,外层回溯我们关注排,内层则遍历列,最终返回结果。

2023-12-07 20:39:54 354

原创 算法训练第二十九天 |491. 递增子序列、46. 全排列、47. 全排列 II

递增子序列要求我们返回所有该数组中不同的递增子序列,首先我们能目标,如例题的4,6,7,7的情况,在正常递归下4,6,7会出现两次,所以我们需要考虑排除重复,但又不能像先前一样使用used数组处理,如果先对数组进行排序,则输出不是子序列,所以本题我们可以使用HashSet作为哈希表记录重复内容。

2023-12-06 19:38:59 410

原创 算法训练第二十八天 |93. 复原 IP 地址、78. 子集、90. 子集 II

复原ip地址这题和我们之前遇到的回文题很像,不同点在于,ip的格式需要我们处理,同时我们以“.”的数量来作为递归终止条件。子集问题和之前的组合问题最大的区别是我们在递归过程中每个子集都应该加入我们的结果集中,则res.add(new ArrayList<>(path));在本题中我们不限制条件。

2023-12-05 19:55:31 569

原创 算法训练第二十七天 |39. 组合总和、40. 组合总和 II、131. 分割回文串

组合问题是经典的回溯算法问题,同时本题可以看出,题干中的数组内同一个数字是可以重复的,所以我们在递归的过程中,为trackBacking传递参数应该传递i(让下一次循环能获取到相同的值)组合总和Ⅱ和Ⅰ不同于不能使用相同的数字,那么我们要考虑两个因素:1.数组内容相同,但是是不同数字,2.相同位置数字重复使用,第一个问题我们可以通过先对数组进行排序,排序后通过 candidates[i] == candidates[i - 1] 判断是否存在重复,而第二个问题我们可以通过设计used数组记录重复元素。

2023-12-04 18:33:04 335

原创 算法训练第二十五天 |216. 组合总和 III、17. 电话号码的字母组合

本题内容和组合题目很相似,不同点在于限制了个数最多为9,同时需要我们在计算过程中加入求和操作,注意求和操作需要在递归的时候进行计算,如果单独计算会导致程序时间复杂度增加本题主要难点在对电话号码字母的处理,我们可以使用Map结构来记录电话号码与字母对应的哈希表,通过哈希表获取每个数字对应的字母,再用回溯的思路解决问题。

2023-12-02 18:40:33 417

原创 算法训练第二十四天 |77. 组合(回溯算法及简单剪枝)

代码中path代表回溯路径,res代表返回内容,我们在指向递归前将path添加内容,在执行递归后再移除内容满足条件的内容添加到res中,同时我们还可以通过剪枝优化这个过程。

2023-12-01 21:12:33 428

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

修剪二叉树与之前的删除二叉树不同在于要区分大小写的情况,当小于low或大于high的情况,进行相应的递归处理,最后将子树递归传递给根结点有序数组转换成二叉搜索树就是对数组进行划分,同时使用递归函数对数组进行操作,最后生成的树就是求解的树二叉搜索树转换成累加树根据题意我们只需要通过右中左的遍历顺序遍历二叉树即可,同时使用sum变量进行统计更新二叉树结点。

2023-11-30 19:59:13 404

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

二叉搜索树的最近祖先问题本质上和二叉树树一样的,但不同的是,二叉搜索树中我们可以通过搜索树的性质更快的遍历搜索,比较root结点的val与p和q进行递归即可二叉搜索树的插入操作我们主要也是利用二叉搜索的性质,对val值进行比较,当我们遍历到null的根结点时就是插入的位置。删除与插入的遍历相同,但不同在于结点的处理,我们需要考虑在删除之后,结点情况,本题中我们使用分类讨论的方法,将几种情况分类解决,最后求解出答案。

2023-11-29 19:19:07 449 1

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

本题主要的处理思路与最大二叉树那题很类似,我们需要设定一个全局变量,并通过全局变量来处理二叉搜索树,最后找到搜索树的最小值二叉搜索树的众数同样也是双指针遍历的思路,由于包含重复我们也可以用双指针去处理二叉树,同时我们可以利用二叉搜索树特性使其遍历更加简单本题关键点一个是注意遍历顺序是后序遍历,我们需要最后再处理中结点,另一个要注意的是递归的终止条件,本题需要区分几个终止条件来处理算法。

2023-11-28 20:59:44 440

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

最大二叉树的思路比较基础,就是我们先找到这个数组的最大值,再根据最大值进行左右划分,遍历左区间和右区间,最后完成递归合并二叉树是我们将合并后的二叉树变成一个树之和的形式,若他不存在结点则将结点添加,存在则求和,我们可以将两个树都合并到root1上,变为一个树二叉搜索树的搜素就是一个简单的递归运算,唯一注意的是搜素过程中我们需要用result记录搜索到的结点,并用结点记录这个树检验二叉树我们需要注意递归顺序使用中序遍历,同时我们要设置一个max值来保证递归过程中一定是小于所有左树的。

2023-11-27 19:24:04 350

原创 算法训练第十八天 |513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

找左下角的值要求我们找到的是最底层的值,所以我们在遍历的过程中应该遍历最后一层的时候再进行记录,这样我们不难发现,用层序遍历整个树最方便路径总和本质上是一个回溯算法问题,我们在遍历整个树的过程中去找目标值等于所求target的路径,同时需要注意过程中判断root是否是叶子结点。中序与后序遍历最关键点在于判断清楚本题逻辑,后序遍历我们可以知道根结点的位置,再根据 根结点的位置将两个树分割为左子树和右子树,再次进行遍历。

2023-11-25 19:26:55 327

原创 算法训练第十七天 |110. 平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

解决本题平衡二叉树问题我们首先需要知道高度是什么,二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。则我们可以用递归的方法按照后序遍历的顺序遍历二叉树,同时罗列出非平衡的情况,平衡情况下我们将指向Math.max(leftHeight, rightHeight) + 1;最后输出结果二叉树的所有路径本质就是一个回溯问题,我们可以遍历二叉树在遇到叶子节点(即左右都为空)的时候进行回溯操作求左叶子就是罗列出左叶子的成立条件即root.left!

2023-11-24 18:36:07 378 1

原创 算法训练第十六天 |104. 二叉树的最大深度、111. 二叉树的最小深度、222. 完全二叉树的节点个数

二叉树的最大深度遍历就是在遍历过程中通过递归的方式每次取到较大的深度,最后返回根结点二叉树的最小深度遍历与最大深度不同是我们只有在左右结点都不为null的情况下才进行深度的添加,不然则遍历一边完全二叉树的结点个数最简单的计算就是我们层序遍历一遍二叉树在遍历过程中添加结点个数,最后返回值。

2023-11-23 20:09:04 383

空空如也

空空如也

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

TA关注的人

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