自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【AI100篇经典论文】Attention Is All You Need

在这项工作中,提出了 Transformer,这是第一个完全基于注意力的序列转导模型, 用多头自我注意力取代了编码器-解码器架构中最常用的递归层。而我主要通过各方收集材料,汇总较好学习的形式,提供给需要的伙伴们。...

2022-07-11 11:23:02 387 1

原创 【AI100篇经典论文】Do ImageNet Classifiers Generalize to ImageNet

我们通常性的认为当我们在训练好的模型上进行验证时,当我们不断地增加训练次数epoch时,对于原有的数据集因为重复性的使用,而导致出现过度拟合overflow的风险增加。然而本论文却通过实验说明了并非是这样的一概而论。...

2022-07-11 11:10:14 1747

原创 如何让Typora做出Word、Pdf的感觉

Typora这款软件真的是让人用起来欲罢不能啊!真的就使用了一次之后,对于其他什么Word、Pdf等等,都已经失去了所有的欲望,一心只想着如何学好使用Typora,让整个页面做得更加美观。

2022-04-17 11:47:19 5881 1

原创 神经网络的参数形成与训练

神经网络的参数导言在上一篇神经网络的介绍当中,具体说明了一个神经元到整个神经网络的形式介绍,但其实并未说明完整;主要完成了神经网络对于“主动性”地一层层接受输入与输出结果,但并未说明其中的参数该如何进行确定的问题,这里将从实际运用的方面进行进一步的探讨。参数形成对于神经网络的参数,第一项主要的任务就是需要知道每一层所需的参数shape大小,这里通过图片的形式进行说明。从这一简单的两层神经网络(输入层不算)开始说明。(为了节省计算成本,所有的神经网络的计算都是通过向量乘积的方式进行!而我使用Pyt

2021-04-30 12:30:08 1100 1

原创 有关神经网络的自我感受、形式介绍、疑问与设计

神经网络简单感受首先,提起神经网络,我们最为直观的感觉是——像大脑中一个个神经细胞连接起来的网状结构一样,这样的联想,可以说是通俗直观、不错的一个类比。现在,在我们的大脑中,从一个简单的神经细胞开始说起。(不是重学生物,而是好形容,嘻嘻)这一个神经元从它的神经突触接收电信号,经过神经元的简单处理,再传给下一个神经元或多个神经元。那么进行对比,我们深度学习中的神经网络,它的一个神经元就相当于一个函数,这个“函数”也需要接受某个输入,再经过一系列的函数关系计算,得到一个结果并输出,对此一个简单的神经元

2021-04-10 16:23:21 341 1

原创 C++/Python 【哈希/贪心】K次翻转完成多米诺骨牌全相等

行相等的最少多米诺旋转题目[leetcode1007]在一排多米诺骨牌中,A[i] 和 B[i] 分别代表第 i 个多米诺骨牌的上半部分和下半部分。(一个多米诺是两个从 1 到 6 的数字同列平铺形成的 —— 该平铺的每一半上都有一个数字。)我们可以旋转第 i 张多米诺,使得 A[i] 和 B[i] 的值交换。返回能使 A 中所有值或者 B 中所有值都相同的最小旋转次数。如果无法做到,返回 -1.示例 1:输入:A = [2,1,2,4,2,2], B = [5,2,6,2,3,2]输出:

2021-01-16 14:54:48 398

原创 C++【哈希】将相同字符词语进行分组

同字符词语分组题目[leetcode49]给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]说明:所有输入均为小写字母。不考虑答案输出的顺序。思路方法一由于需要分组在一起的字母异位词是由相同的字符组成的,所以可以用另一个临时字符串储存它,之后在其内部进行

2020-10-06 12:04:18 491

原创 C++ 【哈希表】最长回文串的确定

最长回文串题目[leetcode409]给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。注意:假设字符串的长度不会超过 1010。示例 1:输入:“abccccdd”输出:7解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。思路按照回文串的对称结构,可以思考出,一种字符在出现时,两边都必须出现,或者在奇数时作为中间字符。所以,最为主要的工作就是统计大小写字

2020-09-28 22:04:59 251

原创 哈希表(又称散列表)的基础知识【定义、映射和构建】

哈希表定义哈希表(Hash table,也叫散列表),是根据关键字值(key)直接进行访问的数据结构,它通过把关键字值映射到表中一个位置(数组下标)来直接访问,以加快查找关键字值的速度。这个映射函数叫做哈希(散列)函数,存放记录的数组叫做哈希(散列)表。如果给定一个表M,存在某个函数f(key),对任意的关键字值key,代入函数后能得到包含该关键字的表中地址,称表M为哈希表,函数f(key)为哈希函数。如图所示:不同的哈希运用:①最简单的哈希-字符哈希int main(){ int cha

2020-09-26 13:47:22 763

原创 C++ 二叉查找树的编码与解码

序列化和反序列化二叉搜索树题目[leetcode449]序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。设计一个算法来序列化和反序列化二叉搜索树。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。编码的字符串应尽可能紧凑。注意:不要使用类成员/全局/静态变量来存储状态。 你的序列化和反序列化算法应该是无状态的。思路

2020-09-06 15:59:16 231

原创 二叉查找树的基础知识(定义、插入和查找数值)

二叉查找树定义一棵具有以下性质的二叉树:若左子树不为空,则左子树上所有节点的值均小于或等于它的根节点的值。若右子树不为空,则右子树上所有节点的值均大于或等于它的根结点的值。左、右子树也分别为二叉排序树。等于的情况只能出现在左子树或右子树中的某一侧。数据结构与二叉树的完全一样:struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(N

2020-09-06 11:17:43 287

原创 C++ 利用二分查找寻找满足条件的区间

区间查找题目[leetcode34]给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1]思路二分查找的基础知识了解,请点

2020-09-05 13:46:21 995

原创 二分法查找的基础知识(递归形式和循环形式)

二分查找算法定义二分查找又称折半查找,首先,假设表中元素是按升序排序,将表中间位置的关键字与查找关键字比较:如果两者相等,则查找成功;否则利用该中间位置,划分出前、后两个子表:①如果中间位置的关键字大于查找关键字,则进一步查找前一个子表。②否则查找后一个子表。重复上述的过程,直到找到目标关键字,输出查找成功,或者查到子表不存在为止,则查找不成功。比如,待搜索数字target == 2数组A = [-1,2,5,20,90,100,207,800]待查找值target = 2下标:[ 0

2020-09-04 10:55:02 257

原创 C++ 树立课程表的正确先后关系

课程安排题目你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]]输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。示例 2:输入: 2, [[1,0],[0,1]]输出: f

2020-09-02 21:36:15 457

原创 图的基础知识(定义、深度优先遍历和宽度优先遍历)

图(Graph)定义由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。图分为无向图与有向图,根据有无图的边长,又分为带权图与不带权图。如下图:深度优先遍历...

2020-09-02 09:27:37 562

原创 C++ 寻找二叉树最右边的数进行相加的和

侧面观察二叉树题目给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4,6]输出: [1, 3, 4, 6]解释:思路提前了解:层次遍历(宽度优先搜索)请点击:二叉树基础知识在右侧观察到二叉树的数,其实就是二叉树每一层的最右边的一个数,如果需要找到最右边的一个数,可以通过层次遍历去了解每一个节点的层数,然后由层次遍历的顺序去修改该层数下的值,由于层次遍历也是在该层的情况下,从左往右遍历二叉树,所以

2020-09-01 09:39:02 174

原创 C++ 将二叉树以前序遍历的顺序转换成链表

二叉树转链表题目[leetcode114]给定一个二叉树,原地将它展开为一个单链表。例如,给定二叉树 1 / \ 2 5 / \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5 \ 6思路方法一: 开辟一个vector实现的存储空间,按照前序遍历的顺序将每一个节点存入到节点空间中,之后就是按从头到尾的将每个节点连接在右节点上,即可

2020-08-27 17:04:31 472

原创 C++ 【深搜】查找两节点的最近父节点

最近的公共祖先题目[leetcode236]给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q

2020-08-23 22:30:34 710 1

原创 C++ 利用二叉树的深度搜索寻找满足要求的路径

路径之和Ⅱ题目[leetcode113]给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[ [5,4,11,2], [5,8,4,5] ]思路所需的基

2020-08-23 15:23:08 459

原创 二叉树的基础知识(定义、深度搜索的三种方式和宽度优先搜索)

二叉树定义树是n(n >= 0)个节点的有限集,且这些节点满足如下关系:(1)有且仅有一个节点没有父节点,该节点称为根。(2)除根外,其余的每个节点都有且仅有一个父节点。(3)树中的每一个节点都构成一个以它为根的树。二叉树在满足树的条件时,满足如下条件:每个节点最多有两个孩子(子树),这两个子树有左右之分,次序不可颠倒。如下图所示:二叉树结构构造代码如下:struct TreeNode{ int val; TreeNode *left; TreeNode *right;

2020-08-23 09:41:21 334

原创 C++ 经典排序方法之一——归并排序思路解析+例题——逆序运用的两种方法

归并排序思路归并排序主要运用了分治的思想,将一组长而复杂的数组,不断分为短小而简单处理的问题,这些个问题都相互独立,但与原问题之间具有的性质相同。得出子问题的解后进行合并,从而深入浅出的解决问题。一般体现了:分解 -> 求解 -> 合并 的过程。我们先从最为基础的步骤:把两个已排序的数组归并排序为一个数组了。就是从头到尾的比较两数组的元素大小,小的数先放入到归并到的数组中,直至其中一个数组的元素已全部遍历放入到归并数组中,另一个数组也全部放入。(如下图所示)实现代码如下:void

2020-08-23 08:52:48 518

原创 C++ 【回溯】经典例题——N皇后

N皇后题目[leetcode 51]n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。皇后的攻击范围为:下图为 8 皇后问题的一种解法。给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。示例:输入: 4输出: [[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", // 解法 2“Q…”

2020-08-21 15:45:09 998

原创 C++【递归】生成合法的括号形式

生成括号题目[leetcode22]数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例:输入:n = 3输出:[ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ]思路按照括号的原则:先有 ‘(’ ,才能有再有 ‘)’ ,并且以 ‘)’ 为结尾,这样的形式才能满足题目要求,也就是说,满足以下格式:①’(’ 的个数要比 ‘)’ 多时,’)’ 才能放入。②左右括号的数量都不能大于等于n。二叉树展

2020-08-21 15:03:06 691

原创 C++ 【回溯】如何在一组数中找到和为目标值的子集

组合数之和2题目[leetcode40]给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,所求解集为:[ [1, 7],[1, 2, 5],[2, 6],[1, 1, 6] ]

2020-08-19 17:44:51 1602

原创 C++【回溯】or【位运算】求数组的所有子集

求子集题目[leetcode78]给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[ [3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[] ]思路假设数组nums的元素个数size()为n个,那么其子集的个数就为2n个,其意义为这n个元素是否放入到一维数组中,共有2n中可能,再将这2n种可能的一维数组放入到二维数组中,便完成了所有子集的求取。那么问题来了:

2020-08-19 16:32:05 2466

原创 C++【贪心+最大堆】加最少次数的油,跑出最远距离的车

最优加油方法题目[leetcode871]汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 station[i][0] 英里处,并且有 station[i][1] 升汽油。假设汽车油箱的容量是无限的,其中最初有 startFuel 升燃料。它每行驶 1 英里就会用掉 1 升汽油。当汽车到达加油站时,它可能停下来加油,将所有汽油从加油站转移到汽车中。为了到达目的地,汽车所必要的最低加油次数是多少?

2020-08-13 19:27:42 878

原创 C++ 【贪心】如何用最少的箭射爆全部气球

射击气球题目[leetcode452]在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了。开始坐标总是小于结束坐标。平面内最多存在104个气球。一支弓箭可以沿着x轴从不同点完全垂直地射出。在坐标x处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后

2020-08-13 16:02:47 760

原创 C++ 【贪心】跳跃游戏Ⅱ 如何用最少的次数实现跳跃至最远的位置

跳跃游戏(进阶版)题目[leetcode45]给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例:输入: [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。说明:假设你总是可以到达数组的最后一个位置。思路因为数组是一定能够到达最后一个位置的,所以还是运用跳跃游戏Ⅰ里

2020-08-13 10:20:54 668

原创 C++【贪心】跳跃游戏Ⅰ

跳跃游戏题目[leetcode55]给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到

2020-08-13 09:54:49 228

原创 C++ 【贪心】以栈优化的形式移除K个数字后最小

移除K个数字题目已知一个使用字符串表示的非负整数num,将num中的K个数字移除,求移除K个数字后,可以获得的最小的可能的新数字。例如:输入:num = “1432219”,k = 3在去除3个数字后得到的很多可能里,如1432、4322、2219、1219、1229…;其中以去掉数字4、3、2得到的1219最小!思路因为越高位的数字决定的大小比低位更有效,所以如果要最小的数字,需要尽可能让新数字优先最高位最小,次高位最小,次次高位最小…最终直到移除够K个数字建立一个数字字符栈,从字符串开头

2020-08-11 17:51:46 539

原创 C++ 【贪心】求摇摆序列的最长长度

摇摆序列题目一个整数序列,如果两个相邻元素的差恰好正负(负正),交替出现,则该序列被称为摇摆序列。一个小于2个元素的序列直接为摇摆序列。例如:序列[1, 7,4, 9, 2, 5],相邻元素的差(6,-3,5,-7,3),该序列为摇摆序列。序列[1 ,4,7,2,5] [7,4,5,5]不是摇摆序列。给一个随机序列,求这个序列满足摇摆序列定义的最长子序列的长度。例如:输入[1,7,4,9,2,5],结果为6;输入[1,17,5,10,13,15,10,5,16,8], 结果为7([1,17

2020-08-11 10:41:53 614

原创 C++ 【贪心】如何用一定量的糖果满足最多的孩子

分糖果题目已知一些孩子和一些糖果,每个孩子有需求因子g,每个糖果有大小s,当某个糖果的大小s大于等于某个孩子的需求因子g时,代表该糖果可以满足该孩子;求使用这些糖果,最多能满足多少孩子?(注意,某个孩子最多只能用1个糖果满足)例如,需求因子数组g=[5,10,2,9,15,9];糖果大小s=[6,1,20,3,8];最多可以满足3个孩子。思路为了更明显的判断某个孩子能够被那个糖果满足,需要对g,s进行排序后观察。提出以下三个问题:①是否直接暴力枚举,尝试每个糖果是否能满足某个孩子?②如果某个

2020-08-11 09:30:26 412

原创 C++ 利用最大和最小堆快速找到中位数【优先级队列】

寻找中位数

2020-08-09 10:42:59 2674 1

原创 C++ 如何利用最小堆找到第K大的数【优先级队列】

寻找第K大的数基础知识构造STL中的最大堆、最小堆,代码如下:std::priority_queue<int> big_heap; //默认构造是最大堆std::priority_queue<int, std::vector<int>, //最小堆构造法 std::greater<int> > small_heap;std::priority_queue<int, std::vector<int>, //最大堆构造法

2020-08-08 09:49:13 1698

原创 C++\C 模拟简单的计算器

简单计算器题目设计一个计算机,输入一个字符串储存的数学表达式,可以计算包括“(”、“)”、“+”、“-”四种符号的数学表达式,输入的数学表达式字符串保证是合法的。[输入的数学表达式中可能存在空格字符]思路因为字符串的格式是合法的,并不需要排除干扰项,但首先需要解决的是以下问题:①给我的字符串如何识别出并转化为数字的多少和所需进行的运算法则。②识别后,计算的过程该如何正确的模拟出来,使得计算顺序不出错。③什么样的情况下进行计算。为了解决上述问题,可以进入一个概念——“状态机”(有限循环自动机)

2020-08-06 18:29:16 1489

原创 C++ 判断出栈顺序的合法化(模拟出栈的形式)

合法的出栈序列题目已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈,也可在栈中停留,等待后面的数字入栈后,该数字在出栈,求该数字序列的出栈序列是否合法?图示:思路想要了解一个数字序列的出栈顺序是否合法,最为直接的方法就是模拟这个数字序列的出栈过程,模拟的规则如下:1.将需要入栈时的1至n个数依次进入栈中。2.当模拟栈中的栈顶数字不等于题目所给的数字序列的开头时,继续进行下一个数字的进入。3.当模拟栈中的栈顶数字等于题目所给的数字序列的开头时,栈和数字序列的首数字同时出栈,之后,再

2020-08-06 10:46:52 1209

原创 C++ 最小栈的实现

最小栈的实现如何实现一个最小栈,使得需要输出最小值时,我能直接获取。难点:由于栈是不提供迭代器,所以无法遍历栈中的数据从而得出最小值。思路:其实可以创建一个另外的栈,称为最小栈,记录原本数据中最小值的状态,有以下两种情况当进入的数据不小于最小值时,最小栈中还是再存放入最小值,当进入的数据小于最小值时,最小栈存放入该数据,并且将其赋值给min。当pop数据时,同时也pop最小栈的数据,当获取最小值时,直接输出最小栈的栈顶top()来直接获取。过程图示:代码如下:#include <stdi

2020-08-05 21:52:57 649

原创 C++ 容器中队列与栈之间的相互实现

队列与栈之间的相互实现基础知识了解首先需要了解队列与之间的相同与不同。相同点:都不提供迭代器,不能遍历,不支持随机存取。不同点:①push()和pop()函数控制的数据进出时,队列是先进先出,而栈是先进后出。②队列可以读取头元素front()和尾元素back(),栈只可读取头元素top()。队列容器结构示意图:栈容器结构示意图:那么在了解完这些基础知识之后,我们会知道他们之间要想相互实现,就是先进先出与先进后出之间的相互转化问题。思路讲解那么为了实现这样的转化,我们就需要一个中转站

2020-08-05 21:18:56 172

原创 C++\C 链表相关问题的思考和总结

链表相关问题如何完成链表的逆序问题一:已知链表头节点指针head,将链表逆序。(不可申请额外空间)问题二:选择性的逆序m到n的链表[1<=m<=n<=链表长度](进阶)链表的交点问题问题一:两个链表之间的交点问题二:单个链表的交点(成环)如何完成链表的逆序问题一:已知链表头节点指针head,将链表逆序。(不可申请额外空间)逆序就好比人们排队时的变换阵型的过程,比如,原本已经排好的队伍,我想要把排头的放在最后,排尾的放到前面来,完成队伍的翻转,这个过程就是把每次排头的人放在新队伍所有人

2020-08-01 22:58:44 255

空空如也

空空如也

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

TA关注的人

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