给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true
。如果数组中每个元素都不相同,则返回 false
。
题目很简单,就只是查找是否存在重复元素,我浮现出的第一个思路就是二层循环,将一个元素与后面所有的元素进行比较值是否相同,思路很简单,代码如下:
class Solution {
public boolean containsDuplicate(int[] nums) {
int len = nums.length;
int i = 0,j = 1;
boolean symbol = false;//symbol用于标记是否有重复元素
for(;i < len - 1; i++){
for(j = i + 1; j < len; j++){
if(nums[i] == nums[j]){
symbol = true;//有重复元素,标记为true同时跳出循环
break;
}
}
}
return symbol;
}
}
思路很简单,也通过了测试,不过我们可以很显然地发现,由于使用了二层循环当数组长度过大时,就会超时,因此需要让循环层数降低,或者删除重复元素比较长度,由于我目前只掌握了Arrays.sort(),因此我选择降低循环层数,思路如下:
先用Arrays.sort()对数组进行排序,重复元素必定相邻,所以我们只需要比较相邻元素的值是否相同,从而减少了一层循环,代码如下:
import java.util.Arrays;
class Solution {
public boolean containsDuplicate(int[] nums) {
Arrays.sort(nums);//先给数组排序
boolean symbol = false;//返回的布尔值默认为false
int i = 0,j = 1;//定义两个指针用于查找元素
for(;j<nums.length;i++,j++){
if(nums[i]==nums[j]){
symbol = true;//有重复元素的时候跳出循环并标记为true
break;
}
}
return symbol;
}
}
结果耗时:4ms 通过
还有一个比较长度的方法,我会在以后进行补充
21.5.28补充:
经过了解,我知道了Set集合有一个条件:传入的对象不能有重复值。那么我的思路就是把nums[]中的所有元素传到Set集合中,然后比较Set集合的长度,Set集合有两种实现:
1.HashSet 由哈希表支持,此类允许使用null元素,也不保证循序.
2.TreeSet 该类在遍历集合时可以按照自然顺序递增排序,也可以制定比较器递增排序。
在这里我们选用HashSet
所以首先我们需要创建一个Set集合
Set<Integer> id = HashSet<>();
然后只需要把元素传入就行,用遍历的方式传入
for(int a : nums){
id.add(a);
}
最后比较nums长度与Set集合长度
if(id.size()!=nums.length) return true;
最后代码如下:
class Solution {
public boolean containsDuplicate(int[] nums) {
Set<Integer> num = new HashSet<>();
for(int len : nums){
num.add(len);
}
if(nums.length!=num.size()) return true;
else return false;
}
}
最后结果确实通过了,但是消耗时间长于前面的先排序在比较元素是否相等。