自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 hot100—87.最长递增子序列

最长上升子序列(LIS)问题可以通过两种主要方法解决:动态规划和贪心算法结合二分查找。动态规划方法通过定义dp[i]为以第i个元素结尾的最长上升子序列的长度,利用状态转移方程dp[i] = max(dp[j]) + 1(其中0 ≤ j < i且nums[j] < nums[i])来计算,最终结果为dp数组中的最大值。该方法的时间复杂度为O(n²),空间复杂度为O(n)。贪心算法结合二分查找则通过维护一个数组d[i],表示长度为i的最长上升子序列的最小末尾元素,利用二分查找优化更新过程,时间复杂度

2025-05-09 00:17:16 631

原创 hot100—85.零钱兑换

文章主要介绍了解决零钱兑换问题的动态规划方法,包括递归搜索、记忆化搜索、递推以及空间优化技巧。通过递归搜索和记忆化搜索,可以有效减少重复计算,提高算法效率。递推方法则将递归转化为迭代,进一步优化了时间复杂度。空间优化部分展示了如何使用滚动数组和单个数组来减少空间复杂度。文章还讨论了完全背包问题的两种写法,推荐外层循环枚举物品的写法,因其常数更小。最后,作者提供了相关题单和题解链接,供读者进一步学习和实践。

2025-05-09 00:02:15 656

原创 hot100—84.完全平方数

本文介绍了两种解决“完全平方数”问题的方法。第一种是动态规划,通过状态转移方程计算最少需要多少个平方数来表示整数i,时间复杂度为O(n√n),空间复杂度为O(n)。第二种方法基于数学中的“四平方和定理”,通过判断n是否满足特定条件,直接返回结果,时间复杂度为O(√n),空间复杂度为O(1)。两种方法各有优劣,动态规划适用于一般情况,而数学方法在特定条件下更为高效。

2025-05-09 00:02:08 1502

原创 SQL50—2.寻找用户推荐人

例如,如果我们尝试比较一个NULL值和一个非NULL值,结果将是UNKNOWN,因为NULL没有一个明确的数值或状态。同样,如果我们尝试比较两个NULL值,结果也是UNKNOWN,因为我们无法确定它们之间的关系。为了解决这个问题,MySQL提供了IS NULL和IS NOT NULL这两个操作符,它们专门用于检查字段是否为NULL。当我们使用IS NULL时,如果字段的值为NULL,查询将返回TRUE;如果字段的值不是NULL(包括字段中有值和字段为空),查询将返回FALSE。

2025-05-09 00:02:01 565

原创 SQL50—1.可回收且低脂的产品

关键字 WHERE 用于根据特定条件过滤表 Products 中的行,条件是 low_fats 列的值为"Y"(表示低脂肪产品)且 recyclable 列的值为"Y"(表示可回收产品)。链接:https://leetcode.cn/problems/recyclable-and-low-fat-products/solutions/2366091/recyclable-and-low-fat-products-by-leetc-hx0p/在这种情况下,我们想要检索 product_id 列。

2025-05-09 00:01:52 368

原创 hot100—86.单词拆分

本文介绍了两种解决“完全平方数”问题的方法:动态规划和数学方法。动态规划方法通过状态转移方程 f[i] = 1 + min(f[i - j^2]) 来计算表示整数 i 所需的最少平方数,时间复杂度为 O(n√n),空间复杂度为 O(n)。数学方法基于“四平方和定理”,通过判断 n 是否满足特定条件,直接返回 1、2、3 或 4,时间复杂度为 O(√n),空间复杂度为 O(1)。两种方法各有优劣,动态规划适用于一般情况,而数学方法在特定条件下更为高效。

2025-05-09 00:01:21 863

原创 hot100—83.打家劫舍

考虑到每间房屋的最高总金额只和该房屋的前两间房屋的最高总金额相关,因此可以使用滚动数组,在每个时刻只需要存储前两间房屋的最高总金额。使用滚动数组,可以只存储前两间房屋的最高总金额,而不需要存储整个数组的结果,因此空间复杂度是 O(1)。偷窃第 k 间房屋,那么就不能偷窃第 k−1 间房屋,偷窃总金额为前 k−2 间房屋的最高总金额与第 k 间房屋的金额之和。在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前 k 间房屋能偷窃到的最高总金额。// f[i][1] 表示 偷第 i 家的结果。

2025-05-08 14:24:54 864

原创 hot100—82.杨辉三角

其余数字,等于左上方的数,加上正上方的数,即 c[i][j]=c[i−1][j−1]+c[i−1][j]。例如 4=1+3, 6=3+3 等。选:问题变成从剩下 i−1 个不同物品中选出 j−1 个物品的方案数,即 c[i−1][j−1]。不选:问题变成从剩下 i−1 个不同物品中选出 j 个物品的方案数,即 c[i−1][j]。动态规划(入门/背包/状态机/划分/区间/状压/数位/数据结构优化/树形/博弈/概率期望)每一排的第一个数和最后一个数都是 1,即 c[i][0]=c[i][i]=1。

2025-05-08 12:05:44 648

原创 hot100—81.爬楼梯

我们不妨写几项来验证一下,根据转移方程得到 f(2)=2,f(3)=3,f(4)=5,……为了优化空间复杂度,我们可以不用保存 f(x−2) 之前的项,我们只用三个变量来维护 f(x)、f(x−1) 和 f(x−2),你可以理解成是把「滚动数组思想」应用在了动态规划中,也可以理解成是一种递推,这样把空间复杂度优化到了 O(1)一般情况下,形如 f(n)=∑。之前的方法我们已经讨论了 f(n) 是齐次线性递推,根据递推方程 f(n)=f(n−1)+f(n−2),我们可以写出这样的特征方程:?

2025-05-08 11:54:01 576

原创 hot100—80.划分字母区间

在得到每个字母最后一次出现的下标位置之后,可以使用贪心的方法将字符串划分为尽可能多的片段,具体做法如下。从左到右遍历字符串,遍历的同时维护当前片段的开始下标 start 和结束下标 end,初始时 start=end=0。对于每个访问到的字母 c,得到当前字母的最后一次出现的下标位置 endc​,则当前片段的结束下标一定不会小于 endc​,因此令 end=max(end,endc​。

2025-05-08 00:30:26 610

原创 hot100—79.跳跃游戏II

链接:https://leetcode.cn/problems/jump-game-ii/solutions/2926993/tu-jie-yi-zhang-tu-miao-dong-tiao-yue-yo-h2d4/我在larger_next_right这座桥上,走到less_next_right位置时也能获取到,而且还能进一步尝试寻找更远的next_next_right。// 更新可移动区间的左端点和右端点。动态规划(入门/背包/状态机/划分/区间/状压/数位/数据结构优化/树形/博弈/概率期望)

2025-05-08 00:20:51 807

原创 hot100—78.跳跃游戏

------遍历nums的每一个数,看每一个下标对应的跳到的最远的位置mx是多远,逐渐往后遍历,讲道理正常情况下,下标i是不可能大于mx的,因为最远就跳到mx了,i>mx的话,是过不去的,例如,从0这个下标,可以跳到1,2,3下标,但是没有办法到达4下标,所以后面都遍历到下标4了,但是跳跃还是在下标3,所以就没有办法跳跃到下标4,返回False,从 0 可以跳到 1,2,最远可以到达的位置 mx=2。动态规划(入门/背包/状态机/划分/区间/状压/数位/数据结构优化/树形/博弈/概率期望)

2025-05-08 00:16:07 304

原创 hot100—77.买卖股票的最佳时机

链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/solutions/2464650/mei-ju-mai-chu-jie-ge-wei-hu-mai-ru-de-z-02ud/从左到右枚举卖出价格 prices[i],那么要想获得最大利润,我们需要知道第 i 天之前,股票价格的最小值是什么,也就是从 prices[0] 到 prices[i−1] 的最小值,把它作为买入价格,这可以用一个变量 minPrice 维护。

2025-05-08 00:12:01 348

原创 hot100—76.数据流的中位数

比如现在有 6 个数:1,5,6,2,3,4,要计算中位数,可以把这 6 个数从小到大排序,得到 1,2,3,4,5,6,中间 3 和 4 的平均值 3.5 就是中位数。回顾一下百科中关于中位数的定义:中位数……可将数值集合划分为相等的两部分。中位数把这 6 个数均分成了左右两部分,一边是 left=[1,2,3],另一边是 right=[4,5,6]。我们要计算的中位数,就来自 left 中的最大值,以及 right 中的最小值。

2025-05-08 00:06:08 795

原创 hot100—75.前K个高频元素

链接:https://leetcode.cn/problems/top-k-frequent-elements/solutions/3655287/tong-pai-xu-on-xian-xing-zuo-fa-pythonja-oqq2/动态规划(入门/背包/状态机/划分/区间/状压/数位/数据结构优化/树形/博弈/概率期望)图论算法(DFS/BFS/拓扑排序/最短路/最小生成树/二分图/基环树/欧拉路径)常用数据结构(前缀和/差分/栈/队列/堆/字典树/并查集/树状数组/线段树)

2025-05-07 23:52:22 1200

原创 hot100—74.数组中第K个最元素

📖 文字题解前言约定:假设这里数组的长度为 n。题目分析:本题希望我们返回数组排序之后的倒数第 k 个位置。

2025-05-07 23:39:24 749

原创 hot100—73.柱状图中的最大矩形

如果我们枚举「宽」,我们可以使用两重循环枚举矩形的左右边界以固定宽度 w,此时矩形的高度 h,就是所有包含在内的柱子的「最小高度」,对应的面积为 w×h。下面给出了这种方法的 C++ 代码。C++public:// 枚举左边界left < n;++left) {// 枚举右边界right < n;++right) {// 确定高度// 计算面积return ans;

2025-05-07 23:23:07 669

原创 SQL50—4.文章浏览

在应用自定义条件来过滤有效行之后,可能会在 author_id 列(例如,author_id = 4 的作者查看了他的文章多次)中遇到重复的作者。在我们的情况下,我们将其设置为 ['author_id'] ,因此仅考虑author_id列中的重复项。我们可以看到每一行的 author_id 等于 viewer_id,而不满足此条件的行被过滤掉了。首先,让我们找到判断作者是否评论了自己文章的条件,即 author_id 等于 viewer_id。# 仅保留包含唯一的 'author_id' 的行。

2025-05-01 11:27:58 512

原创 SQL50—3.大的国家

链接:https://leetcode.cn/problems/big-countries/solutions/2366084/big-countries-by-leetcode-solution-8k13/注意表格有五列,我们需要根据问题的要求返回三列,相对顺序为:name、population 和 area。该国家的人口至少为 2500 万,表示为 population >= 25,000,000。该国家的面积至少为 300 万平方千米,表示为 area >= 3,000,000。

2025-05-01 11:27:52 830

原创 hot100—71.字符串解码

如果当前的字符为右括号,开始出栈,一直到左括号出栈,出栈序列反转后拼接成一个字符串,此时取出栈顶的数字(此时栈顶一定是数字,想想为什么?时间复杂度:记解码后得出的字符串长度为 S,除了遍历一次原字符串 s,我们还需要将解码后的字符串中的每个字符都入栈,并最终拼接进答案中,故渐进时间复杂度为 O(S+∣s∣),即 O(S)。我们可以先解析出一个数字,然后解析到了左括号,递归向下解析后面的内容,遇到对应的右括号就返回,此时我们可以根据解析出的数字 x 解析出的括号里的字符串 s。

2025-05-01 11:27:46 906

原创 hot100—72.每日温度

对于温度列表 [73,74,75,71,69,72,76,73],单调栈 stack 的初始状态为空,答案 ans 的初始状态是 [0,0,0,0,0,0,0,0],按照以下步骤更新单调栈和答案,其中单调栈内的元素都是下标,括号内的数字表示下标在温度列表中对应的温度。由于单调栈满足从栈底到栈顶元素对应的温度递减,因此每次有元素进栈时,会将温度更低的元素全部移除,并更新出栈元素对应的等待天数,这样可以确保等待天数一定是最小的。正向遍历温度列表一遍,对于温度列表中的每个下标,最多有一次进栈和出栈的操作。

2025-05-01 11:27:40 719

原创 SQL50—5.无效的推文

否则,LENGTH() 可能会返回不同的结果,因为该函数返回字符串 str 的字节数,某些字符包含多于 1 个字节。链接:https://leetcode.cn/problems/invalid-tweets/solutions/2366155/wu-xiao-de-tui-wen-by-leetcode-solution-5tfp/以字符 '¥' 为例:CHAR_LENGTH() 返回结果为 1,而 LENGTH() 返回结果为 2,因为该字符串包含 2 个字节。注意,我们需要返回所需的列。

2025-05-01 11:27:28 236

原创 hot100—70.最小栈

对于栈来说,如果一个元素 a 在入栈时,栈里有其它的元素 b, c, d,那么无论这个栈在之后经历了什么操作,只要 a 在栈中,b, c, d 就一定在栈中,因为在 a 被弹出之前,b, c, d 不会被弹出。因此,在操作过程中的任意一个时刻,只要栈顶的元素是 a,那么我们就可以确定栈里面现在的元素一定是 a, b, c, d。当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。

2025-04-30 07:48:02 297

原创 hot100—69.有效的括号

仔细分析我们发现,对于有效的括号,它的部分子表达式仍然是有效的括号,比如 {()[()]} 是一个有效的括号,()[{}] 是有效的括号,[()] 也是有效的括号。并且当我们每次删除一个最小的括号对时,我们会逐渐将括号删除完。因此我们考虑使用栈,当遇到匹配的最小括号对时,我们将这对括号从栈中删除(即出栈),如果最后栈为空,那么它是有效的括号,反之不是。事实上不是的,假如输入是 [{]},每种括号的左右数量分别相等,但不是有效的括号。最坏情况下,假如输入是 (((((((,栈的大小将是输入字符串的长度。

2025-04-30 07:47:56 316

原创 hot100—68.寻找两个正序数组的中位数

如果 m+n 是奇数,返回第 k 小的数。如果 m+n 是偶数,返回第 k 小的数和第 k+1 小的数的平均值。本文先从最暴力的排序做法开始,然后讲解双指针做法,最后过渡到二分做法。一、引入:均匀分组这里的关键是「均匀分组」,每组 5 个数,只要第一组的最大值 ≤ 第二组的最小值,我们就找到了答案。怎么想到要均匀分组的?请看百科中关于中位数的介绍:中位数……可将数值集合划分为大小相等的两部分。二、枚举:双指针做法如果您在阅读的过程中产生了一些疑问,请看后文的「答疑」。

2025-04-30 07:47:50 741

原创 hot100—67.寻找旋转排序数组中的最小值

链接:https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/solutions/698479/xun-zhao-xuan-zhuan-pai-xu-shu-zu-zhong-5irwp/在二分查找的每一步中,左边界为 low,右边界为 high,区间的中点为 pivot,最小值就在该区间内。如下图所示,这说明 nums[pivot] 是最小值左侧的元素,因此我们可以忽略二分查找区间的左半部分。//最小值一定在无序的一边。

2025-04-30 07:47:44 255

原创 hot100—66.搜索旋转排序数组

可以发现的是,我们将数组从中间分开成左右两部分的时候,一定有一部分的数组是有序的。如果 [l, mid - 1] 是有序数组,且 target 的大小满足 [nums[l],nums[mid]),则我们应该将搜索范围缩小至 [l, mid - 1],否则在 [mid + 1, r] 中寻找。如果 [mid, r] 是有序数组,且 target 的大小满足 (nums[mid+1],nums[r]],则我们应该将搜索范围缩小至 [mid + 1, r],否则在 [l, mid - 1] 中寻找。

2025-04-30 07:47:38 393

原创 hot100—65.在排序数组中查找元素的第一个和最后一个位置

由于数组已经排序,因此整个数组是单调递增的,我们可以利用二分法来加速查找的过程。考虑 target 开始和结束位置,其实我们要找的就是数组中「第一个等于 target 的位置」(记为 leftIdx)和「第一个大于 target 的位置减一」(记为 rightIdx)。二分查找中,寻找 leftIdx 即为在数组中寻找第一个大于等于 target 的下标,寻找 rightIdx 即为在数组中寻找第一个大于 target 的下标,然后将下标减一。

2025-04-30 07:47:30 262

原创 hot100—64.搜索二维矩阵

链接:https://leetcode.cn/problems/search-a-2d-matrix/solutions/688117/sou-suo-er-wei-ju-zhen-by-leetcode-solut-vxui/由于每行的第一个元素大于前一行的最后一个元素,且每行元素是升序的,所以每行的第一个元素大于前一行的第一个元素,因此矩阵第一列的元素是升序的。我们可以对矩阵的第一列的元素二分查找,找到最后一个不大于目标值的元素,然后在该元素所在行中二分查找目标值是否存在。空间复杂度:O(1)。

2025-04-30 07:47:24 796

原创 hot100—63.搜索插入位置

不需要ans变量,最后直接返回left就可以了,根据if的判断条件,left左边的值一直保持小于target,right右边的值一直保持大于等于target,而且left最终一定等于right+1,这么一来,循环结束后,在left和right之间画一条竖线,恰好可以把数组分为两部分:left左边的部分和right右边的部分,而且left左边的部分全部小于target,并以right结尾;但这题还多了个额外的条件,即如果不存在数组中的时候需要返回按顺序插入的位置,那我们还能用二分法么?空间复杂度:O(1)。

2025-04-30 07:47:17 858

原创 hot100—62.N皇后

前言「N 皇后问题」研究的是如何将 N 个皇后放置在 N×N 的棋盘上,并且使皇后彼此之间不能相互攻击。皇后的走法是:可以横直斜走,格数不限。因此要求皇后彼此之间不能相互攻击,等价于要求任何两个皇后都不能在同一行、同一列以及同一条斜线上。直观的做法是暴力枚举将 N 个皇后放置在 N×N 的棋盘上的所有可能的情况,并对每一种情况判断是否满足皇后彼此之间不相互攻击。暴力枚举的时间复杂度是非常高的,因此必须利用限制条件加以优化。

2025-04-30 07:47:09 701

原创 hot100—61.分割回文串

对于当前枚举的 j 值,我们使用双指针的方法判断 s[i..j] 是否为回文串:如果 s[i..j] 是回文串,那么就将其加入答案数组 ans 中,并以 j+1 作为新的 i 进行下一层搜索,并在未来的回溯时将 s[i..j] 从 ans 中移除。假设我们当前搜索到字符串的第 i 个字符,且 s[0..i−1] 位置的所有字符已经被分割成若干个回文串,并且分割结果被放入了答案数组 ans 中,那么我们就需要枚举下一个回文串的右边界 j,使得 s[i..j] 是一个回文串。),这里不计算返回答案占用的空间。

2025-04-30 07:47:00 817

原创 hot100—60.单词搜索

设函数 check(i,j,k) 表示判断以网格的 (i,j) 位置出发,能否搜索到单词 word[k..],其中 word[k..] 表示字符串 word 从第 k 个字符开始的后缀子串。这样,我们对每一个位置 (i,j) 都调用函数 check(i,j,0) 进行检查:只要有一处返回 true,就说明网格中能够找到相应的单词,否则说明不能找到。我们额外开辟了 O(MN) 的 visited 数组,同时栈的深度最大为 O(min(L,MN))。=word[k],当前字符不匹配,直接返回 false。

2025-04-30 07:46:54 536

原创 hot100—59.括号生成

如果在遍历过程中 balance 的值小于零,或者结束时 balance 的值不为零,那么该序列就是无效的,否则它是有效的。空间复杂度:O(n),除了答案数组之外,我们所需要的空间取决于递归栈的深度,每一层递归函数需要 O(1) 的空间,最多递归 2n 层,因此空间复杂度为 O(n)。空间复杂度:O(n),除了答案数组之外,我们所需要的空间取决于递归栈的深度,每一层递归函数需要 O(1) 的空间,最多递归 2n 层,因此空间复杂度为 O(n)。如果右括号数量小于左括号的数量,我们可以放一个右括号。

2025-04-30 07:46:47 903

原创 hot100—58.组合总和

回到本题,我们定义递归函数 dfs(target,combine,idx) 表示当前在 candidates 数组的第 idx 位,还剩 target 要组合,已经组合的列表为 combine。) 是一个比较松的上界,即在这份代码中,n 个位置每次考虑选或者不选,如果符合条件,就加入答案的时间代价。链接:https://leetcode.cn/problems/combination-sum/solutions/406516/zu-he-zong-he-by-leetcode-solution/

2025-04-30 07:46:38 669

原创 hot100—57.电话号码的字母组合

回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是不完整的)。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。),其中 m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),n 是输入中对应 4 个字母的数字个数(包括数字 7、9),m+n 是输入数字的总个数。

2025-04-30 07:46:30 785

原创 hot100—56.子集

上面的代码中,dfs(cur,n) 参数表示当前位置是 cur,原序列总长度为 n。在进入 dfs(cur,n) 之前 [0,cur−1] 位置的状态是确定的,而 [cur,n−1] 内位置的状态是不确定的,dfs(cur,n) 需要确定 cur 位置的状态,然后求解子问题 dfs(cur+1,n)。对于 cur 位置,我们需要考虑 a[cur] 取或者不取,如果取,我们需要把 a[cur] 放入一个临时的答案数组中(即上面代码中的 t),再执行 dfs(cur+1,n),执行结束后需要对 t 进行回溯;

2025-04-30 07:46:22 526

原创 hot100—55.全排列

本题解主要是写给对 回溯算法 还比较陌生的朋友,所以会介绍得很详细;如果看题解觉得比较冗长,可以先观看我投稿给「力扣」 官方题解 的视频;本文还在持续更新,由于个人水平和精力有限,没法一下子表达出所有想表达的意思,还请大家见谅。补充说明(2020 年 8 月 31 日补充):请大家做了一些回溯算法的问题以后顺便思考一下:深度优先遍历、递归、栈,它们三者的关系,我个人以为它们背后统一的逻辑都是「后进先出」。完成练习有助于我们深刻理解算法思想,我们加油!回溯算法与深度优先遍历。

2025-04-29 09:23:36 903

原创 hot100—54.实现前缀树

创建一个新的子节点,记录在 children 数组的对应位置上,然后沿着指针移动到子节点,继续搜索下一个字符。此外,若前缀末尾对应节点的 isEnd 为真,则说明字典树中存在该字符串。空间复杂度:O(∣T∣⋅Σ),其中 ∣T∣ 为所有插入字符串的长度之和,Σ 为字符集的大小,本题 Σ=26。时间复杂度:初始化为 O(1),其余操作为 O(∣S∣),其中 ∣S∣ 是每次插入或查询的字符串的长度。重复以上步骤,直到处理字符串的最后一个字符,然后将当前节点标记为字符串的结尾。我们从字典树的根开始,插入字符串。

2025-04-29 09:21:53 727

原创 user - service

2.使用用户名与密码在数据库中查询出UserDO,将其转换为User Info DTO,利用它传入JWTUtil中生成一串jwt密码,再将数据存入UserLoginRespDTO,然后在缓存中存入。4.因为删除的用户名会在一张表与redis中存储,所以我们需要在userReuseMapper中删除数据,利用分片键在redis中删除数据,最后在布隆过滤器中加入用户名。4.在缓存中删除Token,在用户名复用表中添加上此用户名,在缓存中加入此用户名。1. 从前端传入的token,在redis中获取对象。

2025-04-29 09:19:39 532

空空如也

空空如也

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

TA关注的人

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