大家好,我是听雨,是一名跨考计算机专业的研一学生。为提高编程的水平,从今天开始刷编程题目。由于我是算法小白,所以开始只能从简单题开始写贴,请大家多多包涵,希望和大家一起进步!**
题目
今天的第一题选自力扣217. 存在重复元素
解题思路
这道题比较简单,即便是通过双层for循环也可以解出。刚开始我想的思路是该题的核心是找到重复元素即可。所以可以将数组进行排序,之后用for循环比较前后元素是否相同即可。
代码如下:
class Solution {
public boolean containsDuplicate(int[] nums) {
Arrays.sort(nums);
for(int i = 1; i <nums.length;i++){
if(nums[i-1] == nums[i]){
return true;
}
}
return false;
}
}
求解的结果是正确的,但显然使用了排序算法还要再使用一次循环,无论是求解的速度和内存占用都不是很好。因此我换了个方法:使用HashSet。不断在HashSet中添加元素,如果该集合中已经存在该元素就说明有重复元素直接返回true就行。
代码如下:
class Solution {
public boolean containsDuplicate(int[] nums) {
HashSet set = new HashSet();
for(int i = 0; i < nums.length; i++){
if(set.contains(nums[i])){
return true;
}else{
set.add(nums[i]);
}
}
return false;
}
}
这样跑出来的结果为:
能否再精益求精?我查看了速度最快的大佬写的代码,他的思路与我相同,但是运用了一下 set.add() 函数的使用方法,由于集合中的元素是不能重复的,该函数在添加集合元素时候会返回一个布尔值,如果已经有重复元素存在于原集合中就会返回 false 。因此利用这一点,可以再次优化。
代码如下:
class Solution {
public boolean containsDuplicate(int[] nums) {
HashSet set = new HashSet();
for(int i = 0; i < nums.length; i++){
if(!set.add(nums[i])){
return true;
}
}
return false;
}
}
总结
这道题比较基础,主要是对集合特性以及其函数的运用。另外由于我的水平有限,上述代码的健壮性并不好,在日后会有改进!