217. 存在重复元素

148 阅读1分钟

给定一个整数数组,判断是否存在重复元素。如果任意一值在数组中出现至少两次,函数返回 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集合是否有该元素。