今天写217题:存在重复元素,发现了自己的短板-->基础知识不扎实,很多基础的数据类型不会使用,一些方法不了解。导致代码写不出来,知识面太窄了。
在补基础知识的路上,我发现了一个老师都会告诉我们,但我们都不重视的好的学习方法----->看Api文档,真的超级使用,在博客园和本站(CSDN)都有很多大神分享Api文档,我对着敲了一遍
格里菲斯~大佬的代码:
就基本掌握了集合框架的使用,我相信如果我把所有的基础知识的Api吃透的话,我就基础知识肯定可以非常牢靠,^_^
以下是第217的题目描述:

今天刷的217比较简单,只要掌握了Set集合,抓住Set集合的不重复的特性,就可以解决这道题.
以下是官方的答案:
Set<Integer> set = new HashSet<Integer>();
for (int x : nums) {
if (!set.add(x)) {//set:不可重复的,单一存储结果的无序的集合
return true;
}
}
但是,问题是,我不并不了解Set集合啊!
所以我是这样写的:
Arrays.sort(nums);//先排序,让每个数字大小接近的相邻
for(int i=0;i<nums.length-1;++i){
int count=1;
if(nums[i]==nums[i+1]){//每个元素和下个元素相比
count++;
if(count>=2){
return true;
}
}
}
return false;
虽然复杂很多吧,但是还是可以提交成功的,就是运行速度太慢了,而且没有用Set集合的写法简洁,所以我就去b站找视频学习集合框架,老师分享了一个学习方法:去看集合框架的api文档,
搜索出文档后,发现api文档基本包含了所有集合框架的知识,罗列非常详细
ps:来源于博客园--累成一条狗
学会Set集合后:
我优化了我的代码
Set <Integer> set=new HashSet<Integer>();
for(int i=0;i<nums.length;i++){
if(!set.add(nums[i])){//把添加语句放在if里,既可以判断是否重复,又可以添加集合元素
return true;
//set.add(nums[i]):true添加成功 false:已经有一个相同的元素在集合里了,添加失败
}
}
return false;//兜底返回,避免编译错误
}
时间复杂度从开始的O(NlogN)到O(N) 变小
空间复杂度从开始的O(logN)到O(N) 变大
运行速度主要看时间复杂度,所以用Set集合--哈希表的方法,比排序后枚举要快。
和我一样基础不太扎实的小伙伴可以平时多看看api文档^_^

被折叠的 条评论
为什么被折叠?



