自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 排列1.无重复数字

import java.util.ArrayList;import java.util.Stack;class Solution { List<List<Integer>> res =new ArrayList<List<Integer>>(); public List<List<Integer>> combinationSum(int[] candidates, int target) { if(c

2020-12-27 22:24:33 138

原创 子序列6.最长回文子串

1.暴力解从i=0和j=i+1开始枚举所有的子串,然后在每一个子串中都利用方法来判断它是否是一个回文串。判断的过程可以进行剪枝,也就是如果长度不大于上一次的s就不判断。判断方法可以利用双指针法。这种复杂度为O(n3)2.从中心扩展可以从两边开始枚举,也可以从中心开始枚举,判断以它为中心的字符串是否是回文串。分为偶数串和奇数串,只需要进行一次for循环,遍历字符串,遍历到一个位置的时候判断以这个位置为中心的奇数串和偶数串能够得到的最大子串。这样每个位置只需要遍历一遍,在遍历的过程中又遍历一遍,所以是O

2020-12-27 10:17:51 91 1

原创 二分5.寻找两个排序数组的中位数

首先如果使用归并数组找到中间数,则空间复杂度为O(n),时间复杂度为O(n),如果利用一个指针来达到找中位数的过程,模拟归并但不归并,那时间复杂度仍为O(n)由于题中说了是有序的,所以可以尝试二分,这个题本质就是找到数组中第k小的数,k为(m+n)/2或者是(m+n)/2和(m+n)/2+1的平均值。先比较A[k/2-1]和B[k/2-1],若A[k/2-1]<B[k/2-1],则比A[k/2-1]小的数肯定不可能成为k,则直接排除掉A[k/2-1]以及比它小的,可以排除掉k/2的数字,并根据排除

2020-12-27 08:33:04 182

原创 无序数组中找两个数的和为给定值

求一个无序数组中两个数的下标,他们加起来为给定值首先这个题是无序的,所以不能用两个指针遍历得到,如果排序之后再遍历,那样复杂度是O(nlogn)而且返回的是原来的下标。所以不能这么做。只能利用哈希表来用空间复杂度O(N)来换时间复杂度O(N)利用一个hashmap来存储数组的下标,遍历一次即可。import java.util.HashMap;class Solution { public int[] twoSum(int[] nums, int target) { int

2020-12-25 21:45:38 340 1

原创 区间合并4.插入区间

在一堆排好序的数组中插入区间大概思路还是遍历数组,如果此时数组在插入数组左边,则放入数组,如果此时数组在插入数组右边,则先插入插入数组(第一次),然后插入当前数组到结果数组(因为后面都是大于插入数组的了)。如果和插入区间重叠,则合并两个区间。import java.util.ArrayList;class Solution { public int[][] insert(int[][] intervals, int[] newInterval) { if(intervals==

2020-12-23 16:09:48 75

原创 区间调度3.合并给定数组区间

步骤就是先按照数组的左端点来排序,然后遍历排好序的数组,挨个合并,如果当前区间的左端点大于结果数组中最后一个区间的右端点,则把这个区间添加到结果数组中,如果小于,则合并他俩。最好返回list的数组形式list.toArray()就是返回一个数组形式的list,如果不加参数是返回一个object类型的值,如果加了参数是返回参数类型的数组。import java.util.Arrays;import java.util.ArrayList;class Solution { public int[

2020-12-23 15:44:53 128 1

原创 双指针法5.删除数组中重复数字(同向指针)

利用双指针法,left来代表删除过后的数组指针,right代表遍历的指针,一次遍历即可完成更新。class Solution { public int removeDuplicates(int[] nums) { if(nums==null || nums.length==0)return 0; int left=0; int right=1; while(right<nums.length){ if(n

2020-12-23 13:32:34 372

原创 双指针4.三数之和/三数最接近之和/n数之和(异向指针)

输出一个数组中三个数加起来等于0的所有数组,不允许有重复。可以想到最简单的方式就是三层循环遍历所有的组合,但是这样会有重复,所以在遍历之前需要对数组排序,排序之后再开始遍历,如果发现一样则跳过。还可以发现第二层循环确定之后,其实第三层循环只有一个数需要确定,也就是j确定之后第三个数其实已经确定了,所以在每个j循环之前都定义一个变量在数组最右端,当此时三数相加不等于0时就three–,直到相加为0则j++,也就是j和three在确定i的情况下会遍历一遍数组。所以时间复杂度为O(n2)空间复杂度为O()。

2020-12-23 11:20:56 235 1

原创 双指针法3.装水最多的容器(异向指针)11

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。思路就是双指针,从左右分别开始遍历,找较小的那个数,那个数最大的值最多只能是它自己了class Solution { public int maxArea(int[] height) { i

2020-12-23 09:31:30 67

原创 差分数组

换句话说就是求字符串2有没有字符串1排列的子串既然是子串,用的就是滑动窗口,窗口大小和字符串1相同,判断条件就是当前子串中是否有所有字符串1中的全部字符。其中字母都是小写字母,所以用一个数组来代替哈希表。记住如果用HashMap,那用到其中的值的时候要把Intege转成int来比较,不能直接用==来比较两个Integer值。class Solution { int[] map1=new int[26]; int[] map2=new int[26]; public b

2020-12-19 13:42:46 147 1

原创 滑动窗口--替换后最长重复字符子串424

给一个全部是大写字母的字符串,可以替换k次,求替换k次之后字符串中最长的重复子串的长度。首先这个题是连续子串,用滑动窗口法,且是求最长字符串,所以先移动end,当移动到不符合要求时,可以左右一起推进一格(因为此时即使是start先移动,也不可能有比之前更好的答案,最多就是持平,所以干脆全都移动一次)怎么判断是否符合条件,也就是看窗口中最多的重复字符有几个,再加上k就是可以出现的最长字符串,可以用一个哈希表来记录窗口中最多的字符串,如果用HahMap的话,就可以用A到Z来表示各个key,value是出现次

2020-12-19 03:22:39 480

原创 滑动窗口--长度最小的子数组209

给一个数组arr和一个正整数s,找出其中长度最短的大于s的子数组。分析这个题首先是连续子数组,可以用滑动窗口解决,最终要start到最后才结束遍历,所以可以用while循环,在每次end++后,都判断是否达到条件,达到条件则进入while循环来循环移动start直到不满足条件。最终输出最小的min。class Solution { public int minSubArrayLen(int s, int[] nums) { if(nums==null || nums.l

2020-12-18 12:41:43 145

原创 滑动窗口--最小覆盖子串 76

给了字符串s和t,输出包含所有t中字符(注意是所有,1个字母有两次要输出两次)的最小长度的s的子串首先子串想到用滑动窗口,然后用start表示字符串开始,end表示结束,这个一定要等到start遍历完才知道什么时候完成。所以用while。首先start不动,end移动,直到包含了所有的t中的字符,这时开始移动start,移动直到不包含所有的字符之后,end再动,最终输出包含所有字符时最小的字符子串。如何判断是否包含所有字符呢,用一个hashmap来存储t中的所有字符以及它的个数,然后用另一个hashm

2020-12-18 10:32:07 68

原创 滑动窗口--无重复字符的最长子串3

可以知道子串和子序列的区别所以子串一定是连续子串。所以很容易想到滑动窗口法。因为求的是最长无重复字符子串,所以得维护一个set来保存此时其中的元素个数。因为是查找最长序列,所以直接用charAt就可以找到,不用输出字符串,也不用改变,用字符串就行,不用转成字符数组。然后想这个的窗口方式,首先不是固定窗口,然后想这个题的滑动方式,如果把start看成一个字符串的开始,end表示子串的结束,遍历所有start就是遍历以所有字符开头的子串,然后在看其中某一个start开头的子串时,如果他的结束到了end,

2020-12-17 18:49:34 71

原创 partition 2.不改变数组位置使得数组奇数位于偶数前

奇数放在偶数前且保证数之间的相对位置不变类似于快排的partition问题,快排要分为小于大于,等于三个部分,所以需要两个变量less,more来分开,还有一个是cur。而这要分为奇数偶数,需要一个变量mid,还需要cur。快排一直让less和more处于分界处。而这个只有一个变量的时候可以先让mid走几步,走到偶数的地方,让它表示第一个开始的偶数,然后cur再等于它的下一个,开始循环。如果此时是偶数就跳过,是奇数(此时要把这个数插入到mid之前的一个位置,把mid到这个数之间的数全都后移)则将cu

2020-12-17 13:10:43 159

原创 循环排序5.缺失的第一个正数

给一个未排序的整数数组,找出其中没有出现的最小正整数。要求时间复杂度为O(n),空间复杂度为O(1)这个题直接思考就是遍历,如果用哈希表可以轻易解决,但要求空间复杂度为O(1)。也可以从1开始遍历,每个数都遍历一遍数组,这样时间复杂度为O(n2)有个很奇妙的思路就是,数组中的数虽然不都是1到n的,但要求的数是在1到n之间的,因为如果要求的数都不在数组中,那最小的正数只能是n了。所以遍历数组,如果发现这个数在1到n之间,就可以将它放到正确的位置,当遍历完之后,再遍历一次,找到第一个num[i]不等于i+1

2020-12-16 22:27:12 79

原创 循环排序4.错误的集合

集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。简单题。class Solution { public int[] findErrorNums(int[] nums) { int[] res=new int[2]; i

2020-12-16 21:43:20 164 1

原创 循环排序3.找到所有数组中消失的数字

数组大小为n,数字大小为1到n,有些数字出现一次,有些数字出现两次,找到所有没有出现的数字这个题和上一个简直一模一样,只要先进行循环排序,然后输出那些不在自己位置上的数字的下标+1就是原来的值了。import java.util.ArrayList;class Solution { public List<Integer> findDisappearedNumbers(int[] nums) { List<Integer> res=new ArrayLi

2020-12-16 21:11:35 107

原创 循环排序2.找到数组中缺失数字

数组中数字的范围是0到n,数组长度为n,输出数组中缺失的一个数字可以分析出来下标是从0到n-1,而数组中数字的范围是0到n,所以n这个数一定不能出现,如果出现了就继续i++让别的把它换走最后换到最后,如果遍历后没有缺失数,那最后要返回n。要注意的一点就是什么条件换,是比较i和arr[i]吗,那就错了,因为如果这个数字正好缺失了呢,那永远都在换,永远换不到arr[i]==i的情况,所以应该的判断的是arr[i]和arr[arr[i]],要换到的那个位置是否被换过了(基于这个题,因为这个题没有重复值,所以判

2020-12-16 16:53:38 670

原创 partition 1.找出数组的重复数字

不修改数组找到重复数字,在长度为n+1的数组中数字为1到n,则至少有一个是重复的,找出它,但不能修改数组。(1)首先因为不能修改数组,所以只能创建辅助数组,思路很简单(2)如果可以修改则可以利用数组中数特点,数组的数大小都在0到1之间,然后循环排序将数字换到和它下标一样的地方去,然后遍历找到一个下标和数字不同的数字返回。(3)如果要空间复杂度为O(1),则不能创建辅助数组,因为一定包含一个重复的数字,所以将数组根据中间的值分成两部分,一部分是1-v,一部分是v-n,v是中间值,如果1-v中的值个数超

2020-12-16 14:46:22 182

原创 二分2.找出数组中数值和下标相等的元素

输入为递增数组,每个元素都是整数且唯一,值都在n-1之间首先因为值在n-1之间想到循环排序,但这个以及是排序好了,所以用二分是O(logn)。因为这是个递增数组而且每个元素都是整数且唯一,找出一个元素的下标和内容相同。二分查找,如果发现相等则返回,如果发现不相同,则如果下标大于值则往右找,下标小于值则往左找。...

2020-12-16 13:43:32 354 1

原创 二分3.找出0到n-1中缺失的数字

0到n-1中缺失的数字长度为n-1的递增数组所有数字都唯一,且每个数字都在0到n-1之间,所以肯定是缺了一个,找到这个缺了的数字。首先看到这个题的特点是数字在0到n-1之间,可以想到循环排序,但是循环排序是O(n),这个题已经是排序好了,所以用二分。这个数组的特点就是0在下标为0的地方,1在下标为1的地方,除非遇到这个缺失的数字之后,i就在下标为i-1的地方了。所以二分查找这个地方的下标和数字的关系,直到找到这样的数就往前或者往后找,直到最后一个数字则返回下标。...

2020-12-16 13:35:19 114

原创 滑动窗口--和为s的连续正数序列 剑57

和为s的连续正数序列这个题可以发现首先是连续子序列,然后要求和为s的连续子序列,所以很显然是滑动窗口法.这里要注意的是这是一个不固定窗口大小的滑动窗口,所以不用for循环来加减,而用while来手动控制窗口增减,所以进入窗口后有三种状态,第一种是符合结果,则输出,然后扩大或者减小窗口都行。第二种是小于结果,需要减小窗口,此时要先去掉结果中的值,然后窗口边界再加。第三种是小于结果,需要增加值,这时要先扩大边界值,然后再加。(对应于for循环中增加完之后最后再加)import java.util.Array

2020-12-16 13:21:35 87

原创 滑动窗口--找到数组中长度为k的子数组的平均值

滑动窗口法从题目中提取信息,输入为数组,且长度固定为k,求所有子数组的平均数,则很显然是一个滑动窗口问题,用for循环来维持一个窗口的end,每次进来都加且减一个数,在没有到达窗口最大值时就一直加且累计此子数组的sum,当达到最大值后加一个数就减一个数且计算平均值赋值public static double[] findAverages(int K, int[] arr) { double[] result = new double[arr.length - K + 1]; double

2020-12-16 10:04:02 453

原创 算法--数组19.峰值(单边峰值,双边峰值)

求一个数组的中的最值可以股票最大利润将股票以先后顺序存储在数组中,求可以获得的最大利润,也就是什么时候买什么时候卖的得到的最大。如果在遍历到第i个数字时可以得到前i个数字的最小值那自然可以的到这个位置的最小值。所以创建一个min数组来保存此时前i个值的最小值,也用一个min来表示此时全局得到的最小值。(预处理数组法)如果要求右边的最大值,可以创建一个数组来从右向左遍历得到最大值。求数组可以存水的最大量给出一个数组,求它可以装的最大水量,返回面积(是一个长方形,长是两个横坐标的差,纵坐标就是较低的那

2020-12-15 12:49:35 452

原创 n个骰子的点数

求n个骰子朝上一面的点数和s求s所有值出现的概率n个骰子的最大值为6n,最小值为n,n个骰子排列组合为6^n,统计每个点数的次数,然后除以6的n次方才能得到概率如果递归来思考,把骰子分成两堆,一堆为1个,另一堆为n-1个,所以计算这个骰子分别出现1到6再加上f(n-1)的和s。定义一个长度为6n-n+1的数组来保存和s的次数,然后递归遍历每一个和s,出现则加上。最后循环数组算出概率。递归求和的过程是每一个和s都是由所有n个骰子相加得到的,一开始和s等于的是第一个单独的骰子的点数,然后加上下一个骰子

2020-12-15 11:01:46 149

原创 约瑟夫环

n个人围成圈,从0开始报数,一直报到m-1退出,剩下的人继续从0开始报数。求最后一个人在n个人中的编号,这就是一个约瑟夫问题。第一个出列的人定是m%n-1.然后剩下的人组成了一个新的约瑟夫环第一个人从m%n开始,剩下人又会组成一个新的约瑟夫环子问题...

2020-12-15 09:15:30 180

原创 判断是否为扑克牌顺子

判断一个数组是否是顺子把0当成大王,小王,可以替任何数字,判断输入的数组是否可以连着首先这个题数组的数字没有顺序,输入也没有规定,如果要在遍历一遍之后知道是否连着,需要一个额外的数组来确定他们的顺序并同时记录最大值和最小值。如果发现最大值和最小值之间相差会小于输入的长度(考虑的0的情况),说明是连着的。且不能有重复的(重复肯定不连着了)public class Solution { public boolean isContinuous(int [] numbers) { if

2020-12-12 17:30:39 326

原创 滑动窗口 --固定窗口大小子数组最大值239

求滑动窗口最大值给定一个数组和滑动窗口的大小,求出滑动窗口的所有最大值如果暴力解决就是每次窗口滑动之后都遍历求最大值,复杂度为O(nk)可以把滑动窗口看成一个队列,滑动就是在开头加一个数,在结尾减一个数(用deque或者LinkedList)那现在的问题就是如何找到队列中的最大值,这时就要保证每个队头输出的一定是当前窗口的最大值,队列中的顺序是从小到大的,就有点类似于实现栈的min()操作.遍历整个数组,要执行的有三步,分别是加入右边的元素到队尾,删除左边的元素,将结果加入res。第一步加入之前要先

2020-12-11 13:32:24 396

原创 改变1.翻转字符串

翻转单词顺序反转单词顺序但单词内部顺序不变思路就是先翻转所有的字符然后再翻转每个单词中字符的顺序。public class Solution { public String ReverseSentence(String str) { if(str==null || str.length()==0) return ""; char[] c=str.toCharArray(); reverse(c,0,c.length-1); int

2020-12-11 10:59:42 75

原创 双指针1.和为s的数字序列(异向指针)

和为s的两个数字输入一个递增序列和一个数字s,输出任意一对数字使得他们的和是s。最简单的方法是依次遍历中再遍历,为O(n2)先选两个数字(选第一个和最后一个),如果发现和大于s,则将后面那个向前移动,如果发现小于s,则将前面那个向后移动。反正就是穷举。这样遍历一次就可以,O(n)import java.util.ArrayList;public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [

2020-12-10 11:54:29 124

原创 位操作2.数组中数字出现的次数

数组中只出现一次的两个数字除了这两个数字外其他都出现了两次,找到这两个数字要求空间复杂度为O(1),时间复杂度为O(n)如果只有一个只出现一次的数字,首先根据异或的性质,任何一个数字异或它自己都等于0,所以从头到尾依次异或之后就会出现最终那个只出现一次的数字。所以现在的思路是将数组拆成两份,一份包含一个只出现一次的数组,这样就可以按照上面的思路来做了。我们还是异或一遍,得到的结果就是两个数字的异或结果,这两个数字不一样,所以一定不是0.至少有一位为1,然后找到这个数字中第一个为1的位置,计为第n位

2020-12-10 11:05:24 124

原创 后序遍历DFS3.平衡二叉树(树的深度)

求输入根节点的深度(最长路径)递归思路,如果把树分成三部分,求树的左树深度,求右树深度,则深度就为更大的一个加1.使用后序遍历,得到左和右的深度之后就可以了。public class Solution { public int TreeDepth(TreeNode root){ if(root==null){ return 0; } int ld=TreeDepth(root.left); int rd=Tr

2020-12-09 10:23:52 296

原创 中序遍历DFS.1.二叉排序树第k个结点

返回二叉搜索树的第k个节点中序遍历是从小到大的,返回第k个就行递归写递归的时候,视角应该是在最上面的那个节点,然后想象遍历它的左子树怎么样,如果在这个节点会怎么样,然后再遍历右子树,而不是以一个底层节点的视角来看。public class Solution { int seq=0; TreeNode KthNode(TreeNode pRoot, int k) { if(pRoot==null || k==0){ return null

2020-12-09 09:51:49 585

原创 二分1. 在排序数组中查找数字出现次数

在排序数组中查找数字排序数组往往用的是二分求排序数组中的数字出现的次数首先利用二分找到第一个数字,然后在它的左侧和右侧可能都存在这个数字,顺序扫描左右直到找到所有的这个数字,但这样是O(n)。第二种方法是更好的利用二分查找,也就是找到第一个这个数字和最后一个这个数字,即可得到这个数字的出现次数。找第一个数字的时候,首先找到中间的数,将它和要找的数比较,如果不等于它,说明这个数肯定在两边,则继续往两边找,如果等于这个数,就看它是不是第一个数,如果不是,继续往左边找,直到找到第一个数。第三种方法是变

2020-12-09 09:11:50 490

原创 两个链表的第一个公共节点52

输入两个链表,返回他们的公共节点(1)第一反应是遍历链表,每遍历第一个节点就遍历一次第二个链表,则长度为n和m时,复杂度为O(m*n)(2)然后分析他们的特点,发现如果是有公共节点的话,那整体就像一个Y字,则所有的公共节点都在尾部,而第一个公共节点就是公共节点的开头,我们需要倒序遍历,一直到第一个。那这就需要栈,准备两个栈一直遍历到结束,这时输出两个栈的元素直到不同的时候停止,此时的那个元素就是第一个公共节点。这样的空间复杂度和时间复杂度都是O(m+n)。(3)第三种思路是先遍历一次得到两个链表的长度

2020-12-08 20:04:02 83

原创 归并1.逆序对+小和问题(归并)

求一个数组的逆序对总数=求一个数右边有多少个数比它小逆序对就是一个数组中前面的值和大于后面的值的一组数。那么把数组分成前后两部分,分别进行归并,归并到最后merge两个数组,在这个过程中排序,并且计算出有多少个数是逆序的。这样到后来归并两个数组的时候,已经知道两个数组各自有多少逆序对了,只需要计算归并过程中产生的逆序对。因为已经是排序完的,所以找到第一个大于第二段中的值的时候,第二个值一定小于全部的第一段中的值,所以count要加上第一段中的剩下的所有数据。注意两点1.进行移位操作的时候一定记得加上

2020-12-08 19:04:17 108

原创 第一次只出现一个的字符(哈希)

找到第一个在字符串中出现1次的字符最直观的想法就是遍历字符串,每遇到一个字符都遍历后面的字符,看有没有不重复的,这种做法最好是O(n),平均是O(n2),所以并不是最好的。那第二种方法就是统计每个字符在字符串中出现的位置,那要有一个东西来记录就是用空间换时间,比如哈希表。哈希表可以把一个字符映射成一个数字,所以哈希表的key定义为字符,value定义为数字,就可以遍历一遍得到每个字符的出现次数,然后再遍历一遍,出现一次的第一个字符就是第一个。hashmap可以直接拿来用,但这个题可以通过自己实现一个简

2020-12-08 14:41:47 219

原创 丑数

求出第n个丑数丑数的意义就是因子只有2,3,5,也就是一个丑数必定是由另一个丑数乘2,3,5得到的,然后他要求第n个,那就从第1个开始求,一直求到第n个即可解决,那怎么求呢,规定第一个是1,那后面的就是1乘2,3,5,每一个丑数都可以得到3个新的丑数,所以要按顺序来选一个最小的丑数,因为每个数都要乘3次得到3个新丑数,所以设置3个指针。分别标志这个数的这3次乘乘到哪了,用一个n次的循环来每次找一个丑数,如果找的是对应数的哪次乘,将这个指针后移,说明该下个数乘它了其实是一个动态规划,从小开始从前面的数求

2020-12-07 22:29:08 121

原创 算法--字符串6.最长不含重复字符的子字符串

找出字符串中最大的不重复子串,并返回它的长度。首先想到可以找出所有子串,所有长度所有挨个遍历(和全排列不一样,全排列可以改变顺序,称为子序列),每个字符串判断是否重复比较简单,就遍历并存储前面的字符,如果出现重复则放弃并记录长度,最后返回最大长度。但这样很显然复杂度太大。一个字符串有O(n2)字符串,还要每个字符串遍历一次,共O(n3)可以利用动态规划,定义f(i)为以第i个字符为结尾的无重复子串最大长度则f(i)=f(i-1)或者是f(i-1)+1,如果i处的字符不重复就加1.如果f(i)处的字

2020-12-05 15:28:46 134

空空如也

空空如也

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

TA关注的人

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