存在重复元素(第10题)

106 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

菜鸟就要从第10题继续

一、题目描述:

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

第一版:暴力求解,两层循环依次对比。时间复杂度高。

哈希,理论上我们只需要遍历一次就知道了所有的值,可以判断出是否存在重复值,而不需要两次循环。是否可以通过存入哈希表来减少一次遍历及查找时间?采用set进行储存,set.has()set.add()函数完成功能

参考答案针对第一版其实可以在遍历时进行排序,再对比相邻值就可以判断是否有重复元素,这样不必嵌套循环,也可以提升。注意排序的写法nums.sort((a, b) => a - b),js的sort方法传入的比较函数,若为负值,则a在b前,也就是从小到达排列。

三、AC 代码:

1、第一版

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var containsDuplicate = function(nums) {
    for(let i=0;i<nums.length-1;i++){
        for(let j=i+1;j<nums.length;j++){
            if(nums[i]==nums[j]) return true
        }
    }
    return false
};

2、哈希表

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var containsDuplicate = function(nums) {
    let setNew = new Set()
    for(let i=0;i<nums.length;i++){
        if(setNew.has(nums[i])) {
            return true
        }
        else{
            setNew.add(nums[i])     
         }
    }
    return false
};

3、排序

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var containsDuplicate = function(nums) {
    nums.sort((a, b) => a - b);
    const n = nums.length;
    for (let i = 0; i < n - 1; i++) {
        if (nums[i] === nums[i + 1]) {
            return true;
        }
    }
    return false;
};