给定一个整数数组,判断是否存在重复元素。如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 ;
时隔一年,偶遇该题满满的感动。
1、双重循环遍历数组
以前只有一个想法:
var containsDuplicate = function(nums) {
for(let i=0;i<nums.length;i++){
for(let j=i+1;j<nums.length;j++){
if(nums[i]==nums[j]){
return true;
}
}
}
return false;
}
这不是很简单嘛?直接双循环遍历不就行了?完全没有算法和复杂度的考虑。
时间复杂度O(n^2),空间复杂度为O(1);
2、单循环遍历数组
后来想到了可以先排序呀,排完序前后比较也可!这是思想的转变:
var containsDuplicate = function(nums) {
nums.sort((a,b)=>{
return a-b;
});
for(let i=1;i<nums.length;i++){
if(nums[i]==nums[i-1]){
return true;
}
}
return false;
}
排序算法就很多了,
我图方便直接用了库函数sort。哈哈!
3、set数据结构的引用,让代码更简洁。
var containsDuplicate = function(nums) {
let set=new Set(nums);
return set.size==nums.length?false:true;
}
通过将数组转换为set结构,set结构特性决定了它里面的数据都是不重复的。转换后通过size和length属性的值比较,即可知道是否有重复数。
缺点:需要将所有数字都转换,有点多余。可以考虑set的has方法的应用。
4、set集合的按需添加
var containsDuplicate = function(nums) {
let set=new Set();
for(let i of nums){
if(set.has(i)){
return true;
}
set.add(i);
}
return false;
}
挨个将数组元素添加到set集合中,在添加之前都问一下set集合是否有该元素。