- 博客(46)
- 收藏
- 关注
原创 代码随想录算法训练营第六十天| LeetCode84.柱状图中最大的矩形
题目描述: 84.柱状图中最大的矩形.注意两边要加0,这是个反向的接雨水
2023-09-25 22:43:22
192
原创 代码随想录算法训练营第五十八天| LeetCode739. 每日温度、496.下一个更大元素 I
题目描述: 739. 每日温度.单调栈其实就是一个有序的存放已经遍历过的内容的栈,那如果求比遍历过的内容大的位置,那就栈顶大,栈尾小,用当前元素和栈尾元素比较即可。题目描述: 496.下一个更大元素 I.思路基本相同,月底那个要注意返回的是什么。
2023-09-21 15:44:26
185
原创 代码随想录算法训练营第五十五天| LeetCode647. 回文子串、516.最长回文子序列
题目描述: 647. 回文子串.d[i][j]是表示从i到j的子串是否是回文串,首先考虑i和j位置上的是否相等,不相等的话肯定不是回文串。相等的话还要看dp[i+1][j-1]是什么情况。题目描述: 516.最长回文子序列.其实和回文子串思路是一样的,但是回文子序列没有那么多要求,如果两个都加进去不行的话,就考虑只加一个,而且要记住dp的含义,不要直接返回dp[-1][-1]
2023-09-16 20:56:45
178
原创 代码随想录算法训练营第五十二天| LeetCode1035.不相交的线、583. 两个字符串的删除操作、72. 编辑距离
题目描述: 1035.不相交的线.思路就是,相等的话不用操作,不相等的话,删除1,删除2,或者都删除,但是每次删除都要计数。注意初始化。题目描述: 583. 两个字符串的删除操作.考虑这个过程 ,如果两个不相等,可以删除一个,可以删除两个,或者都删除,不用考虑删除完了会不会还是不相等的,因为上一个状态一定是相等的。题目描述: 72. 编辑距离.一个单词的增加,就是等同于另一个单词的删除,替换的话就是从dp[i-1][j-1]新增一个操作即可。
2023-09-16 12:03:48
152
原创 代码随想录算法训练营第五十天| LeetCode1035.不相交的线、53. 最大子序和、392.判断子序列、115.不同的子序列
题目描述: 1035.不相交的线.因为要找不相交的所有相等线,而且连线的顺序绝对遵守原顺序,所以其实就是找最长相等子序列。53. 最大子序和题目描述: 53. 最大子序和.392.判断子序列题目描述: 392.判断子序列.开始编辑距离了如果是由上或者左上决定的,那么就可以用滚动数组,遍历倒叙。如果是由左决定的,使用滚动数组时要正序并且进行记录题目描述: 115.不同的子序列.一定要注意初始化,此外状态转移也要思考好,i和j的顺序其实无所谓。
2023-09-14 20:05:32
70
原创 代码随想录算法训练营第五十天| LeetCode300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组、1143.最长公共子序列
题目描述: 300.最长递增子序列.考虑的是:以当前节点为终点的递增序列,最长为多少。题目描述: 674. 最长连续递增序列.718. 最长重复子数组题目描述: 718. 最长重复子数组.滚动dp只要dp[i][j]是由dp[i-1][j]或者dp[i-1][j-1]决定的,就可以使用滚动数组本体的主要思路就是,遍历每个字符串的每一位,然后对比以该位为终点的相同的子串有多少位,如果该位相同,那就在前一位的基础上+1,否则的话,就置为0题目描述: 1143.最长公共子序列.需要考虑两个字符串任
2023-09-14 11:56:20
81
原创 代码随想录算法训练营第四十九天| LeetCode188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
题目描述: 188.买卖股票的最佳时机IV.思路其实和上一题是一样的,奇数和偶数状态都有规律。题目描述: 309.最佳买卖股票时机含冷冻期.买股票的问题,还是要基于当前的状态去考虑,有还是没有,有的话是怎么来的,没有的话又是怎么来的。
2023-09-10 01:43:33
247
原创 代码随想录算法训练营第四十八天| LeetCode121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
这个题是只能买一次然后卖一次,只有一次机会。可以使用两个变量来代替这个。这个是随时买随时卖。用多维数组表示状态。
2023-09-10 01:42:21
324
原创 代码随想录算法训练营第四十六天| 多重背包理论、LeetCode198.打家劫舍、LeetCode213.打家劫舍II、LeetCode337.打家劫舍 III
遇到树的动态规划,可以仅使用n个元素的数组,表示n个状态,由于树的遍历是递归的,因此每一个节点都会产生一个这样的状态数组最后取max即可。多重背包可以理解为每个物品有多个,但是有使用限制,这就介于01背包和完全背包之间。遇到环,就考虑首尾元素。因为他们是挨着的,只能选一个或者都不选。已经不是背包问题了!
2023-09-08 16:33:17
41
原创 代码随想录算法训练营第四十五天| LeetCode322. 零钱兑换、LeetCode279.完全平方数、LeetCode139.单词拆分
一定要想清楚背包问题是什么,就是用一些内容去填充一个空间,那么这道题就是一个用单词去填充字符串的题目。此外单词可以重复使用,并且单词是有排列需求的,因此就是完全背包的排列问题,因此先遍历背包,再遍历物品。注意一定要初始化,并且所有元素最开始应该是一个无穷大的值,因为方案是比小,而不是比大。
2023-09-07 11:25:26
76
原创 代码随想录算法训练营第四十四天| 01背包和完全背包的对比、LeetCode518.零钱兑换II、LeetCode377. 组合总和 Ⅳ、LeetCode70. 爬楼梯
但是在完全背包中,如果需要考虑有多少种方案,而不是最大能装多少,那么遍历顺序就有讲究了,如果先遍历物品再遍历背包,那么就是组合问题,{1,5}会出现但是不会出现{5,1},但如果先遍历背包再遍历物品,就会出现{1,5}和{5,1},这就是排列问题,如果需要考虑排列,就要先遍历背包。除此之外,遍历顺序也有不同,根据递推公式我们可以看出,01背包一维数组时,背包的遍历顺序一定是倒序,因为决定当前状态的时上一轮的左边的内容,但是完全背包的一维数组,决定当前状态的是当前的状态,所以一定要从前往后遍历。
2023-09-06 16:25:05
62
原创 代码随想录算法训练营第四十二、三天| 01背包、LeetCode416. 分割等和子集、LeetCode1049.最后一块石头的重量II、Leetcode494.目标和、Leetcode474.一和零
题目描述:1049.最后一块石头的重量II题目描述:1049.最后一块石头的重量II。
2023-09-04 00:43:45
90
原创 代码随想录算法训练营第三十九、四十一天| LeetCode62.不同路径、LeetCode63. 不同路径 II、LeetCode343. 整数拆分、Leetcode96.不同的二叉搜索树
拆分j那里还是有点模棱两可,现在只能理解为j*(i-j)是拆成两个,而j * dp[i-j]是拆成两个及以上,但还是有些不明白为什么j到i//2就可以了,另一半不需要遍历么?现在明白了,这是根据数学论证而来的,一个数字的拆分相乘最大,那么一定是几个近似的值相乘,如果j已经大于一半了,那么必不可能是最大值,这是一种剪枝方法。其实和上一题差不多原理,但是需要知道的是,有障碍物的位置,它对应的dp一定一定是0,根据另一个数组的值判断当前dp的情况即可。还有边界情况,将边界都设为1,因为到边界的方法就只有一种。
2023-09-01 01:41:06
899
原创 代码随想录算法训练营第三十八天| LeetCode509. 斐波那契数、LeetCode70. 爬楼梯、LeetCode746. 使用最小花费爬楼梯
一定要注意边界情况满不满足,另外就是从dp[i-1]到dp[i]是一种方法,从dp[i-2]到dp[i]也是一种方法,所以dp[i]的方法就是两个的和。dp表示第n层的最小花费,那如果cost有n个,说明已知0到n-1层往上走的开销,那么楼顶是第n层,dp数组长度就是n+1.接下来就是常规的状态转移。
2023-09-01 00:11:56
38
原创 代码随想录算法训练营第三十七天| LeetCode738.单调递增的数字 、LeetCode968.监控二叉树(未完成)
从后向前判断,后小于前就更改后为9,前-1。
2023-08-31 22:30:09
122
原创 代码随想录算法训练营第三十六天| LeetCode435. 无重叠区间 、LeetCode763.划分字母区间、LeetCode56. 合并区间
和气球差不多,一定要注意更新r指针的位置,更新为两个区间的最小值,其实也应该更新l指针,但是由于使用l的大小进行排序了,所以l指针更新不更新都无所谓了。这个思路非常巧妙,考虑每个字母第一次出现的区间即可,累计最大区间,如果遍历到了最大区间的位置,就是当前字符串的截断位置。基本和之前的区间问题差不多。
2023-08-30 19:06:41
79
原创 代码随想录算法训练营第三十五天| LeetCode860.柠檬水找零 、LeetCode406.根据身高重建队列、LeetCode452. 用最少数量的箭引爆气球
基本思路想到了,但是不需要单独设置一个用于存储交集的列表,使用两个指针来维护最后一个交集的区间即可。整体思路真的很难,先用身高排序,然后k值小的在前面,最后直接从大到小满足k值的要求即可。没什么难度,优先消耗10块的。
2023-08-29 22:45:34
79
原创 代码随想录算法训练营第三十四天| LeetCode1005.K次取反后最大化的数组和、LeetCode134. 加油站、LeetCode135. 分发糖果
这个问题并不是将问题最小化,而算是阶段化,不能单个加油站去看,而是这个环状路程中的一段一段去看,如果某一段路程中油耗尽了,那么这一段的任何一个点都不能当作起点,如果我想找到整个路程中的起点,就要遍历这个路程中的每一段,如果这一段欠油,就累计欠的油量,并且将起点设为这一段的下一段的开头,最后遍历完每一段,如果能把拖欠的油全都补完,那么起点就可以设定为最后设为start的那个点,否则就是无法满足跑完一圈的条件。那么就需要遍历两次,一次是通过左边的元素确定当前的元素,另一次是通过右边的元素确定当前的元素。
2023-08-28 23:06:52
94
原创 代码随想录算法训练营第三十二天| LeetCode122.买卖股票的最佳时机II、LeetCode55. 跳跃游戏、LeetCode45.跳跃游戏II
目前来看贪心算法可以将问题最小化,然后再扩大整体范围。那么买卖股票的最小范围就是某一天和这一天的后一天。那就可以考虑每一天是否能挣钱就行了,只要后一天的价格比当天的价格高,那就前一天买入,后一天卖出即可,把能赚钱的一小天扩大到整个时间范围内即可。只需要考虑每一步最多能走到哪里就行,如果最多走到的位置无法达到当前的这一步开始的地方,那就直接return False。只要记录每个阶段的最大边界范围,然后在这个阶段遍历的时候寻找下一个阶段的最大范围,注意边界情况。
2023-08-26 22:45:56
58
原创 代码随想录算法训练营第三十一天| LeetCode455.分发饼干、LeetCode376. 摆动序列、LeetCode53. 最大子序和
我们可以从少量的数字来考虑这个问题,如果只有一个数字,是-1的话,那么就不管他,如果数字是正数,那么我们就要他,那扩大到序列来看,如果一个序列的和为负数,那么我们就不要他,如果一个序列的和为正数,我们就还要他。当然最好通过后面的逻辑进行判断。平 上,就会多出来两个摆动节点,那其实完全可以等到判断出这个节点是波动节点,然后再更新前一个差就好了,如果平,那么前一个差会保持不变(一直是负号),只有遇到向下的时候,才会更新一个新的前一个差。一个节点的前面的差和后面的差是异号的,那这个节点就是一个摆动节点。
2023-08-26 01:52:20
63
原创 代码随想录算法训练营第三十天| LeetCode332.重新安排行程、LeetCode51. N皇后、LeetCode37. 解数独
思路就是在一个棋盘上的每一个点进行回溯,不要想象成一个二维的期盼,把它想象成一个长数组,需要我们去填空,然后每一个空都可能是1-9,每一个空进行一次回溯,如果到了最后一个空返回的是True,就一层一层向上,如果某个位置1-9都不合适,就可以从这个回溯中出去了,要回到上一层重新进行回溯。还有一个需要注意的点是,为了能直接返回第一个遍历成功的路径,可以设定一个True返回值,然后在每次回溯结束之后进行判断,若是True就返回上一层。由于是str类型,所以不能直接使用索引进行修改,只能是通过切片的方式。
2023-08-23 00:47:49
86
原创 代码随想录算法训练营第二十九天| LeetCode491.递增子序列、LeetCode46.全排列、LeetCode47.全排列 II
但是单独使用num[i]==num[i-1]会去掉过多的内容,这是为什么呢,因为这道题中是允许出现重复元素的,那么就要在同一层或者是同一向下的回溯进行。在每一层的排列中,都会需要遍历所有的元素,并且还没有固定的顺序,那么这个时候就需要用一个整体的used,对应元素的索引位置的used设为bool值,并且这个used也要加入到回溯中。使用set是去重的又一种方法,由于原序列不可以进行排序,所以不能用num[i] == num[i-1]这样的方式去重,因此使用set集合,查看当前的i是否在set中。
2023-08-21 23:24:53
140
原创 代码随想录算法训练营第二十八天| LeetCode93.复原IP地址、LeetCode78.子集、LeetCode90.子集II
由于遍历的数组中会出现重复的元素,所以最后遍历的结果也有可能发生重复的现象,为了避免重复,还是先将数组排序然后避免重复遍历,一定要记住每次遍历的i一定要先大于起点,然后再判断是不是和上一个重合。子集也是求组合的方式,只不过每次回溯的时候都要将当前的path加入到res中,注意传递给下层回溯的start应该是当前的i+1,这样可以避免重复遍历。3.如果当前子串取完数字,已经达到了4位ip地址,而还有剩下的子串,直接return。4.如果当前已经没有剩下的子串,但是还不够4位ip,直接return。
2023-08-21 01:11:50
47
原创 代码随想录算法训练营第二十七天| LeetCode39. 组合总和、LeetCode40.组合总和II、LeetCode131.分割回文串
2.如何能避免相同的集合由于顺序不同都存放在res中:这个问题就需要考虑的比较多了,首先是要考虑为什么会出现这样的情况,我们知道根据1的内容,不会存在两个相同位置的元素出现在同一个path中,但有可能出现两个不同位置的元素是相同的内容,这样就存在了相同的path,只不过内部的顺序不同,那如果想要避免这个情况,就要从同级回溯的角度去思考,为了避免同级有重复,可以先将数组排序,然后在同级的位置,也就是每一层的回溯中,去除重复的元素,这样可以避免path内容相同但顺序不同的情况。
2023-08-20 00:10:27
107
原创 代码随想录算法训练营第二十五天| LeetCode216.组合总和III、LeetCode17.电话号码的字母组合
之后就要考虑如何向下传递,首先必须将对应的层数传递下去,这个层数从第0层开始(这样是方便对应数字的索引)一直到第len(digits)层结束,其实所有的数字在第len(digits)-1层就已经遍历完了,那么进入到第len(digits)层之后,就会先判断层数是否等于len(digits),这样就可以将此时的path加入到res中,并且返回。最后,这道题其实可以使用隐式回溯,是因为这道题向下传递的是字符串,而并非指向一个列表的变量,因此可以使用隐式回溯。回溯问题一律看成横向竖向都进行的树即可。
2023-08-19 00:17:07
49
原创 代码随想录算法训练营第二十四天| LeetCode77. 组合
4.使用剪枝操作时,最后的边界范围可以缩小,因为总共path最多有k个,range最大范围是n+1,此时path已经有了len(path)个节点,所以还需要向path里加入k-len(path)个节点,这k-len(path)个节点中,还有一个给当前遍历的i留出来位置,所以右边界应该是n+1-(k-len(path))+1,化简可得:n-k+len(path)+2。1.因为数字是从1开始,所以遍历也要从1开始,n作为结尾的话,遍历的range应该是有个n+1(先不考虑剪枝)
2023-08-18 10:06:01
63
原创 代码随想录算法训练营第二十三天| LeetCode669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
需要注意的是,如果root不在范围之内,那么它的左右子树有可能有一个是在范围之内的,遍历有可能在范围之内的子树就好了。因为是从后往前累加,只需变成反向的中序遍历即可。
2023-08-17 13:17:13
134
1
原创 代码随想录算法训练营第二十二天| LeetCode235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
5.找到了,该节点又有左孩子又有右孩子,可以将左孩子接到右孩子的最左端节点,然后返回右节点就好了。2.找到了,该节点没有指向任何东西,那在该结点的返回的就可以直接是None。主要思路就是,第一个符合在p和q之间的值的节点,就是他们的最近公共祖先。因为题目说了必定会有一个这样的节点,所以return root即可。3.找到了,该节点有左孩子,没有右孩子,那就返回左孩子。4.找到了,该节点有右孩子,没有左孩子,那就返回右孩子。按顺序找就行了,注意函数的返回值是什么就好。1.没找到,直接返回就好。
2023-08-16 02:17:31
63
1
原创 代码随想录算法训练营第二十一天| LeetCode530.二叉搜索树的最小绝对差、LeetCode501.二叉搜索树中的众数、LeetCode236. 二叉树的最近公共祖先
接下来就要判断它的左右子树了,如果左右子树都分别返回了内容(这个内容是不可能重复的,因为p和q都只有一个),那这个节点就是要返回的内容,最终一直到根节点,根节点的另一边没有返回内容,所以最后返回的是这个节点。判断每一颗树就好,首先判断它自身,如果它是q或者是p,那么直接返回他就好,如果这个节点和另一个节点不在一个分支上,那就作为left或者right条件,如果他是另一个节点的父节点,最后也会返回到结果中。如果在递归里想用指针的话,需要将一些值放在递归之外。如果左右只有一个,那返回有的那个即可。
2023-08-15 17:12:01
118
原创 代码随想录算法训练营第二十天| LeetCode654.最大二叉树、LeetCode617.合并二叉树、LeetCode700.二叉搜索树中的搜索、LeetCode98.验证二叉搜索树
迭代和递归地主要思路是相似的,由于两个树是不一样的,所以不可能将两个树的所有节点都遍历到。如果两个树都有的节点,要进行相加的处理,如果只有一个树有节点,那么就直接把这个节点搬过来就行,如果两个数都没有这个节点,跳过即可。
2023-08-14 18:36:50
50
原创 代码随想录算法训练营第十八天| LeetCode513.找树左下角的值、LeetCode112. 路径总和、LeetCode105、106从中序与后序遍历序列构造二叉树
递归的主要思想就是找到最深的叶节点,那如何判定是不是最左端的呢?无论是各种遍历方式,只要是第一个深度为n的接电脑,那一定是最左端的,因为遍历一定是先左后右。不光在队列中维护一个node,同时要维护一个path,每个node的path之间不相干。如果想要有显式回溯的话,那么就需要在处理节点之前先将节点值考虑在递归中,代码如下。
2023-08-12 20:48:17
123
1
原创 代码随想录算法训练营第十七天| LeetCode110.平衡二叉树、LeetCode257. 二叉树的所有路径、LeetCode404左叶子之和
多了一个path列表,当一个node被加入的时候,这个node的path也被加入其中,在pop每个节点之后,都要把path同时pop出来,那如果这个节点是叶节点,那就直接在结果中加入这个path。本写法中的回溯,指的是我子节点的路径遍历结束,需要将子节点从当前path中取出来,当前节点则可以通过他的父节点取出来。如果有左节点,且左节点没有子节点,那么就可以对左节点计数,否则就要进入到左右节点看情况了。由于是要对叶节点访问计数,并且是只有左边的叶节点,因此最终要访问到的是左叶结点的父节点。
2023-08-11 23:49:47
112
1
原创 代码随想录算法训练营第十六天| LeetCode222.完全二叉树的节点个数
完全二叉树的特性就是一定会由多个满二叉树构成,那么如何判断是不是满二叉树呢,左节点一直向左延申,右节点一直向右延申,左右深度一样,就是一个满二叉树。
2023-08-10 12:17:49
74
1
原创 代码随想录算法训练营第十五天| 二叉树的层序遍历、LeetCode226.翻转二叉树、LeetCode101. 对称二叉树
递归的方法就是找共性,共性就是每个节点都有子节点,然后想找每一层的输出,他们的层数就是一样的,层数就对应着res的长度-1,只要左在前,每一层遍历的时候都一定会从左到右进行遍历,通过层数来控制插入值的位置,这样就不用考虑遍历和插值操作的先后顺序了。考虑的是什么是相同的,要继续往下走,而这道题就是需要用后序遍历,遍历的内容是两个节点是否相同,也可以说两棵树是否相同,那如果两个节点的值相同,他们的子节点就不一定相同,那么就还是要先遍历子节点。第二要考虑在每次递归里都做什么,什么是重复的部分?
2023-08-10 01:49:02
56
1
原创 代码随想录算法训练营第十四天| 二叉树的递归遍历、迭代遍历、统一迭代
所以大致的流程就是,遍历根节点的左节点,并且把每个父节点都加入到栈中,直到遍历到空的位置,这时就可以从栈取出节点进行处理,然后处理这个节点的右节点,当指针指向的节点为空的时候,从栈中取出的节点一定是上一个处理的节点的父节点。统一的迭代的想法就是,将遍历的过程和处理的过程分开来,先遍历,然后父节点之后紧跟一个none来表示这个是父节点,每一个子节点都会变为父节点,所以就算某个节点是某个节点的左节点或者右节点,他最后都会成为一个父节点,这样在遍历他的时候就要先存储再操作。左右高度相差不超过1。
2023-08-09 01:03:54
38
1
原创 代码随想录算法训练营第十三天| LeetCode239. 滑动窗口最大值、LeetCode前 K 个高频元素(未完成)
其次是单调队列,在这里面的单调队列不需要将所有元素都放到队列里,加入的元素如果比当前的元素大,那直接将当前的小的元素扔掉(因为当前的小元素肯定会被先淘汰),然后取出元素的时候要看是不是取得当前最大元素,如果是的话,那就证明大元素应该被拿出去了,否则的话不需要进行任何pop操作。extend是在尾部多数据入队,extendleft是在队头多数据入队。append是在尾部入队,appendleft是在队头入队。pop是在尾部弹出,leftpop是在队头弹出。deque也可以直接索引,从队头开始。
2023-08-08 15:40:12
117
原创 代码随想录算法训练营第十一天| LeetCode20. 有效的括号、LeetCode1047. 删除字符串中的所有相邻重复项、LeetCode150. 逆波兰表达式求值
注意整除用//,向0取整用int(a/b)
2023-08-05 16:26:55
67
1
原创 代码随想录算法训练营第十天| LeetCode232.用栈实现队列、LeetCode225. 用队列实现栈
主要是使用两个栈来模拟队列的进出过程,一个输入栈用来存储,当需要输出的时候,如果输出栈不是空的,直接将输入栈的内容放到输出栈,这样就可以保证输出的顺序和输入的顺序是一样的。第一次接触到这个deque,看起来是双向队列,明天仔细研究下。
2023-08-04 23:44:46
58
1
原创 代码随想录算法训练营第九天| LeetCode28. 实现 strStr() 、LeetCode459.重复的子字符串
前缀表:模式串除了最后一个字符的所有子串(但必须从第一个开始),以及他们对应的最长相等前后缀后缀表:模式串除了第一个字符的所有子串(从后往前,从最后一个开始)最长相等前后缀:在最前和最后完全相同的子串开始匹配的位置就是前缀表最大数对应的字符串的索引位置。next数组有三种方式,第一种是正常的状态,第一是整体右移动,左边第一位填充-1,第二种是所有内容-1。
2023-08-04 00:50:08
109
1
原创 代码随想录算法训练营第八天| LC344.反转字符串 、LC541. 反转字符串II、剑指Offer05.替换空格、LC151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
题目描述: 344.反转字符串.栈range法(其实也是双指针)reversed法切片列表推导541. 反转字符串II题目描述: 541. 反转字符串II.不要过度简洁,也不要过度复杂。题目描述: 剑指Offer05.替换空格.填充,替换等问题,用双指针效果不错题目描述: 151.翻转字符串里的单词.直接翻转所有单词的顺序剑指Offer58-II.左旋转字符串题目描述: 剑指Offer58-II.左旋转字符串.python处理字符串的技巧太多了,有点混乱,感觉pytho
2023-08-03 12:09:51
67
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人