- 博客(40)
- 收藏
- 关注
原创 【动态规划——子序列】
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。如果不存在 公共子序列 ,返回 0。输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
2023-10-02 23:47:11
155
原创 【01背包问题】
链接:leetcode题目链接有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x!= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块 石头。返回此石头 最小的可能重量。如果没有石头剩下,就返回 0。
2023-10-02 21:47:41
208
原创 【贪心】!||分发饼干,最长子序列和,买卖股票最佳时间Ⅱ
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
2023-09-29 00:20:43
98
原创 【信号处理】基础
信息熵确实傻子都能看懂,比如我信息熵用于表示随机变量不确定性,即信息熵越大则变量的不确定性越大,即包含的信息量越大相对熵相对熵又成为KL散度、KL距离,常常在图像和音频中描述两个分布的差距。用于描述q(x)对于p(x)的拟合程度、如果两个分布差异越大,那么相对熵越大如果当预测的q(x)和真实p(x)完全相同,那么KL散度的值为0KL散度有个致命的问题,那就是当两个分布差距过于大的时候,此时KL散度没有意义了,因为太大了。
2023-09-07 02:02:51
46
原创 【信号处理】基础知识——傅里叶变换
复指数e^jwt到底是啥动态可视图谐波是指电流中所含有的频率为基波的整数倍的电量,一般是指对周期性的非正弦电量进行傅立叶级数分解,除了基波频率的电量,其余大于基波频率的电流产生的电量,称为谐波。相位差则是时间差在一个周期中所占的比例。我们将时间差除周期再乘2Pi,就得到了相位差。三角函数正交基——周期2Π的信号傅里叶级数表示——周期T的傅里叶级数表示三角函数是正交基大神版链接奉上T趋于无穷线性时不变系统的作用就是通过乘以相应频率点上的频率响应值来逐个改变输入信号的每一个傅里叶系数。即,y[n]的第k
2023-09-03 01:06:35
696
原创 图像知识补充
在成像的过程中,入射光线经过不同程度的折射,投影到尺寸有限的成像平面上,使得鱼眼镜头与普通镜头相比起来拥有了更大的视野范围。在半球空间中,半球面上两个面积相同的图案,成像后,在成像平面上的两个图案的面积仍然相同(虽然两者形状不一定相似)。透视变换: 透视变换将图像投影到一个新的视平面,是二维到三维再到另一个二维(x’, y’)空间的映射。物体在成像平面上离开画面中心的距离,与物体在空间中离开光轴的角度成正比,这个比例系数就是镜头焦距。(3)使用LM算法最小化定位的图像点和投影的图像点之间的投影误差;
2023-08-28 14:20:39
36
原创 【C++基础知识】模板
提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
2023-08-28 14:20:10
31
原创 【C++ 基础知识】封装、继承、多态
定义类成员属性私有化private为成员属性赋值public,设置void set,获取int get()成员函数进行操作语法: class 子类 :继承方式 父类(子类——派生类,父类——基类)派生类包括:基类继承+新增成员//公共页面class Basepublic://继承public:父类子类;public继承:A——public;protected继承:A——protected;private继承:A——private;
2023-08-24 01:35:07
37
原创 DAY38补!||斐波那契数列,爬楼梯,使用最小花费爬楼梯
输入:cost = [1,100,1,1,1,100,1,1,100,1]F(n) = F(n - 1) + F(n - 2),其中 n > 1。解释:F(2) = F(1) + F(0) = 1 + 0 = 1。解释:F(3) = F(2) + F(1) = 1 + 1 = 2。解释:F(4) = F(3) + F(2) = 2 + 1 = 3。n阶台阶,还可以定义n+1长的数组,大不了dp[0]不赋值,为0嘛。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。解释:你将从下标为 1 的台阶开始。
2023-08-23 01:41:43
38
原创 视觉slam14讲||ch5 OpenCV实践
单目相机:丢失深度信息,只能知道投影坐标小孔成像模型——成像平面到像素坐标(一次缩放+一次平移)——相机位姿,世界坐标系变换到相机坐标系齐次坐标乘上任意常数表达意义不变——投影方程意义:(P为投影坐标,相机坐标系)归一化处理:投影过程也可看为归一化平面上的点量化测量。
2023-08-20 01:22:39
342
原创 信号处理MATLAB——自适应滤波
维纳滤波是最小均方误差(MMSE)准则下的线性滤波,它在已知信号和噪声的相干函数或功率谱的情况下,通过求解维纳-霍普夫(Wiener-Hopf)方程,对平稳信号进行最优预测和滤波。如果利用信号相关的瞬时值来估计梯度矢量,即可得到最常用的最小均方(LMS)算法。LMS算法的优点是比较简单,能达到满意的性能,但收敛速度慢,对输人信号相关矩阵的特征值分散度敏感。从LMS算法的原理容易看出,在非平稳环境下,只有当输入信号变化比LMS算法学习速度慢时,才能进行自适应跟踪,所以LMS算法一般适用于平稳信号环境。
2023-08-19 19:14:50
132
原创 DAY29!||递增子序列,全排列,全排列Ⅱ
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素。输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列。
2023-08-10 16:31:20
52
原创 DAY28!||组合总和Ⅱ,子集,子集Ⅱ
加一个bool型数组used,用来记录同一树枝上的元素是否使用过,集合去重的重任就是used来完成的。“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。初次接触去重,有点不好理解,很多操作也不熟练,排序想复杂了,去重没有注意到树层与树枝的区别。输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]要去重的是同一树层上的“使用过”,同一树枝上的都是一个组合里的元素,不用去重。返回的解集中,子集可以按 任意顺序 排列。
2023-08-10 00:21:02
28
原创 DAY27!||分割回文串,复原IP地址
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。简单来说呢,就是切割专场,差不多了吧,主要是字符串截取方式没想到这么简单粗暴,需要复习一下字符串操作(不过字符串那个专题大部分都是双指针操作),然后日常判断不好终止条件。给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。输出:[[“a”,“a”,“b”],[“aa”,“b”]]
2023-08-08 22:31:36
31
原创 DAY25!||电话号码的字母组合,组合总和
先用字符串数组表把每个按键数字对应的字母列出来,然后index选取输入的第index位数字时,首先要转化成这个数字对应的字母字符串。因为输入的数字是string类型的,所以“ -‘0’ ”转化为真正的数字,再从数组表中找到对应的字母串。输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]注意 2 可以使用多次。2.每一个数字代表的是不同集合,也就是求不同集合之间的组合,注意for循环范围。输出: [[2,2,2,2],[2,3,3],[3,5]]
2023-08-07 16:33:40
35
原创 DAY24!!!||组合,组合总和
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。剪枝优化:如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了。给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围。输出: [[1,2,6], [1,3,5], [2,3,4]]图中可以发现n相当于树的宽度,k相当于树的深度。
2023-08-07 13:20:50
40
原创 【肠鸣音】特征提取
瞬时特征本身的识别意义较低,无法通过瞬时特征对信号的类型进行直接判断,是一种比较低级的特征。但是通过多种瞬时特征的组合可以构成高级的信号特征以更好地表现信号的特性。在此基础上,又引入了倒谱特征,包括线性预测倒谱系数和美尔频率倒谱系数等,实现复杂肠鸣音信号特征的提取。倒谱可以将频谱上的高低频率分开, 目前语音识别领域常用的重要特征有线性预测倒谱系数 LPCC 和美尔频率倒谱系数 MFCC。谱形状特征表征的是肠鸣音在很短时刻的静态特征。(3) 波形指标, 表示信号的波形特征,其敏感性较差,但是稳定性较好。
2023-08-04 20:32:28
66
原创 信号处理——降噪滤波:自适应滤波器
通过维纳滤波所求解的维纳解,必须在已知输入信号与期望信号的先验统计信息,以及再对输入信号的自相关矩阵进行求逆运算的情况下才能得以确定。所以,又借助于最速下降算法,以递归的方式来逼近这个维纳解,从而避免了矩阵求逆运算,但仍然需要信号的先验信息,故而再使用瞬时误差的平方来代替均方误差,从而最终得出了LMS算法。自适应滤波,就是利用前一时刻以获得的滤波器参数的结果,自动的调节现时刻的滤波器参数,以适应信号和噪声未知的或随时间变化的统计特性,从而实现最优滤波。误差信号的最小均方值就是肠鸣音信号的最优估计。
2023-08-04 19:23:58
1078
原创 DAY18!|| 二叉树的所有路径,路径总和
回溯可隐藏在traversal(cur->left, count - cur->left->val)这里, 因为把count - cur->left->val 直接作为参数传进去,函数结束,count的数值没有改变。这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。其实可以反过来,每一次减去根节点,如果最后和清空了,就说明路径和刚好,会少一个参数。传参也太多了吧hhh。
2023-07-31 16:52:32
45
1
原创 【肠鸣音】研究背景和原理
通过用电子听诊器手机记录肠鸣音,通过滤波和降噪处理后。分析肠鸣音的频域和时域,客观定量的分析肠鸣音的特点。通过频谱分析,自适应滤波,小波变换,主成分分析等信号处理方法对肠鸣音进行自动提取和特征分析。由于肠鸣音随机性强,人为听诊客观性和准确性较差,临床医生对异常肠鸣音的漏检率达36%。
2023-07-31 15:46:55
101
1
原创 视觉SLAM14讲 ch4
假定对某个旋转R,对应李代数为Φ,给他左乘一个微小旋转,记作ΔR,对应李代数为ΔΦ,那么李群上为ΔR·R,李代数上根据BCH近似,为J(left)ΔΦ+Φ。:与李群对应的一种结构。一个集合加一个数域加一种二元运算。反之,李代数上的假发可以近似为李群上带左右雅可比的乘法。运动是连续的,因此SO(3),SE(3)都是李群。李群->李代数,SO(3)到so(3)的映射关系。即通过BCH近似,可以定义李代数上的倒数。旋转矩阵+矩阵乘法=旋转矩阵群。eg.整数,离散,不构成李群。p.s. 只有一个运算的集合。
2023-07-30 18:51:17
157
1
原创 DAY17!||最大最小深度,平衡二叉树,左叶子之和
一开始不太理解左叶子节点的记录意思,我觉得现在可以理解为,若左节点不是叶子节点,就继续找左子树中的左叶子节点,若左节点是叶子节点,那也不存在后序左子树了。代码的逻辑其实是求的根节点的高度,根节点的高度就是二叉树的最大深度,所以一般通过后序求的根节点高度来求的二叉树最大深度。左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。2.不能直接对比左右节点的最小高度,否则会犯上述错误,一侧节点为空,另一侧节点有树,不能算最小高度。
2023-07-30 14:44:54
27
1
原创 视觉slam14讲 ch3
(万向锁:Pitch为±90°,系统丢失一个自由度——存在奇异性问题)四元数可以看作是一种扩展的复数,也可以看成是一个标量和一个矢量。坐标系:世界坐标系,机器人坐标系(相机坐标系)旋转向量:三维向量,一个旋转轴+一个旋转角。欧拉角:旋转分解为按 z-y-x 顺序转动。变换矩阵:四维矩阵,16个量表示6自由度。即 yaw - pitch - roll。旋转矩阵:三维矩阵,9个量表示3自由度。复数可以表述二维平面的旋转。刚体运动:平移+旋转。坐标系变换:欧氏变换。转换:罗德里格斯公式。
2023-07-28 21:43:38
89
1
原创 DAY16!|| 二叉树的最大、最小深度,完全二叉树的节点
因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!节点为空的情况有:(注意我们比较的其实不是左孩子和右孩子,所以如下我称之为左节点右节点)此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。其实这些题用层序遍历就是套模板。
2023-07-28 00:14:12
35
1
原创 SLAM14讲 ch1-ch2 理论部分
视觉里程计:根据两帧 / 局部几帧计算运动和结构,生成局部地图,估计运动轨迹。红外光或ToF,主动发射信号,类似激光,但室外易受太阳光影响。结合不同时刻视觉里程计+回环检测,生成全局一致性轨迹和地图。1.安装在环境中:GPS/二维码Marker/导轨、磁条。里程计:根据两点间运动,累计生成运动轨迹。运动方程:机器人怎么从上一刻到这一刻的。缺失深度信息,移动相机后才有视差。计算量较大,通过基线确定深度范围。可能上述只能生成特征点地图,重建。(未知环境,便于携带)方法:特征点法,直接法。:IMU/激光/相机。
2023-07-27 17:56:18
46
1
原创 DAY15!||层序遍历,翻转二叉树,对称二叉树
今天其实做了好多道层序的题,九道吧,有两道不太会,一个是,N叉树,一个是指向右侧节点,明天总结吧,对称二叉树用层序试了一下,好像不行,两个vector好像不能直接比较。递归时不要忘了每层节点在结果中的输入,判断深度 depth 和二维向量的 size 关系,决定是再开一行还是直接输入。给你二叉树的根节点 root ,返回其节点值的 层序遍历。给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。行:sizeof(matrix[0]);列:matrix[0].size();
2023-07-27 01:03:47
73
1
原创 Kringing插值原理与工具箱使用
用空间上所有已知点数据加权求和来估计未知点的值。但权重系数并非反距离插值那种取距离的倒数,而是满足某点处估计值 z’ 与真实值 z 的差最小的最优系数。普通克里金插值法假设空间属性均一。空间任意一点(x,y)都有同样的期望c和方差d。空间相似度 d 由欧氏距离表达。空间相似度与半方差rij有函数关系。由已知数据观测点找最优拟合曲线的函数关系,再用于查找预测。转为带约束条件的最优化问题。求解一个半方差函数。
2023-07-26 21:31:43
909
1
原创 DAY14!||二叉树的前序,中序,后序
首先,传递参数,既然是 void 型不返回参数,那记录二叉树的数组就应该传递的是地址,因此不要忘记 vector& result中的地址符号。其实,每次遍历传递的是根节点的指针,因此结构体指针访问内容要用“->”。给你二叉树的根节点 root ,返回它节点值的 前序 遍历。结构体用点( . ),结构体指针用箭头( -> )。结构体用点( . ),结构体指针用箭头( -> )。也就是说点的左边必须为实体,箭头左边必须为指针。也就是说点的左边必须为实体,箭头左边必须为指针。1.指针中(.)和(->)的区别。
2023-07-25 23:00:05
53
原创 DAY13!|| 前k个高频元素,(滑动窗口最大值)
这里定义小顶堆时,由于是键值对,所以以pair形式定义,虽然排序的是value,但是要查找的是key,便于后续堆中元素读取。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。3).题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。输入: nums = [1,1,1,2,2,3], k = 2。2).k 的取值范围是 [1, 数组中不相同的元素的个数]
2023-07-24 22:11:35
40
原创 有效括号,删除相邻重复元素,(逆波兰表达式求值)
之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。总结来说,涉及重复查找的可以用哈希表,涉及删除添加元素的可以用链表(一般链表首先考虑虚拟头节点),涉及字符串匹配的要用KMP算法(虽然我还没学会),涉及消除类的,对称的或者相邻重复的用栈。给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,“
2023-07-23 00:23:11
43
1
原创 DAY10!!||用栈实现队列,用队列实现栈
链接:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true;
2023-07-22 01:59:11
34
1
原创 day 8! 反转字符串,替换空格,翻转字符串里的单词,左旋转字符串
链接:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。输入:s = [“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]输出:[“h”,“a”,“n”,“n”,“a”,“H”]2).s[i] 都是 ASCII 码表中的可打印字符。
2023-07-19 16:19:05
105
原创 DAY7!||四数相加,赎金信,三数之和),(四数之和)
链接:给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]输出:2解释:输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]输出:1。
2023-07-18 22:49:02
80
1
原创 DAY4! ||两两交换链表中的节点,删除链表倒数第n个节点,链表相交,(环形链表)
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3。先计算两个链表的长度,由于相交后使用同一链表,可以认为是将尾部拉齐了,因此就相当于先移动长链表,然后长短链表指针一起移动,寻找交点。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。
2023-07-17 23:27:54
225
1
原创 day6! ||有效的字母异位词,两个数组的交集,快乐数,两数之和
首次接触map,因为不要求有序,所以unorded_map就可以了,其实这道题也相当于反向思考了,每找一个数,先看能不能在搜寻历史中找到它的补集。题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!把字符映射到数组也就是哈希表的索引下标上,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。
2023-07-17 23:25:36
220
1
原创 DAY3! 移除链表元素,反转链表,设计链表(仍存疑)
因此新定义一个虚拟节点 pre 位于原头节点之前,使其为 NULL,令原头节点的 next 指针指向该 NULL 虚拟节点,就可以使其变为尾节点,再令 pre 和 cur 均向后移一位,去反转第二个节点为倒数第二节点,逐步实现新链表从后到前依次排序。但问题在于,对于头节点来说,无法找到上一个节点,因此为了执行的统一性,定义一个虚拟头节点。给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点。输出:[1,2,3,4,5]
2023-07-14 23:09:10
661
1
原创 DAY 2!有序数组的平方,长度最小的子数组,螺旋矩阵
因为除了终止点不动右移起始点的情况外,最外侧循环也会更新终止点位置,可能存在移动起始点,新的子数组不包含前面的某一个较大的值后,子数组和不达要求,开始右移终止点,连续移动多位才达到要求,使新的子数组长度变长的情况。然后起始点开始移动,找到该终止点下最短的子数组,并与已有子数组长度比较,若比已有长度短,则更新子数组长度。自我实现时采用的是,给子数组长度初始赋一个循环中不可能出现的值,比如 num.length+1 ,如果最后验证子数组长度为这个,说明循环没改变长度值,没有子数组满足条件。
2023-07-13 22:05:31
838
原创 DAY 1!二分查找与快慢指针
利用vector特性,遍历数组,与val不等,则在数组后拷贝,与val相等,就积累次数v,最后返回长度为,数组原长度nums.length - 积累次数v,最后返回数组是添加了无val的长数组去掉前面原数组。自我实现没有成功,主要原因是边界判断不对,middle陷入了死循环,只有一个元素的时候,无限循环,且没有办法跳到判断数组中没有的元素的return -1。第一天刷了好久,应该有五六个小时,也只刷了基础,不过是从自我实现一步一步走的,希望后面能好转吧!1).你可以假设 nums 中的所有元素是不重复的。
2023-07-12 18:41:16
1061
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人