问题描述

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

示例 1:

输入:nums = [1,2,3,1]
输出:true

示例 2:

输入:nums = [1,2,3,4]
输出:false

示例 3:

输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true
力扣原题目地址:https://leetcode.cn/problems/...

解决方案

方案一 遍历数组并使用对象记录元素之前是否出现过

思路:初始时,定义一个对象用于记录。当我们遍历数组的时候,可以拿到数组中每一项,看看这一项在对象中是否曾经出现过,如果出现过,就说明和之前的重复了;如果没出现过,说明是新的项,就把新的项装进对象中去,等待后续继续匹配看看会不会和当下的这个重复的。代码如下:

 var containsDuplicate = function (nums) {
    let obj = {} // 1. 定义对象用于存储记录每一项是否出现过
    for (let i = 0; i < nums.length; i++) { // 2. 遍历数组进行一项一项的比较
        let key = nums[i] // 3. 拿到每一项的值
        // 4. 看看此项是否在对象中。对象中是否有某个属性名key  key in obj ?
        if (key in obj) { // 7. 未来的某一时刻,突然出现了,当前项之前有过
            return true // 8. 就说明有重复项,返回告知结果即可
        } else { // 5. 一开始肯定是没有的,所以咱就给对象记录一下
            obj[key] = 1 // 6. 给对象加上一个key、value属性名属性值
        }
    }
    return false
};

leetcode提交结果图

方案一 遍历数组并使用Map集合记录元素之前是否出现过

思路和对象一项,只是把使用对象记录换成Map集合记录了。

var containsDuplicate = function (nums) {
    let map = new Map() // 1. 定义一个集合用来记录
    for (let i = 0; i < nums.length; i++) { // 2. 遍历数组,拿到每一项
        // 3. 一开始集合是空的,所以看else
        if (map.has(nums[i])) { // 5. 若后续项在集合中曾经有过(即曾经追加,现在又来个一样的)
            return true // 6. 就说明重复啦,返回告知结果即可
        } else { // 4. 给集合追加当前项,存一份用于后续的判断
            map.set(nums[i], 1) 
        }
    }
    return false // 7. 要是操作了一波以后,依然是没法返回true,说明每一项都不一样,即没有重复项
};

leetcode提交结果图

方案三 对比去重前和去重后数组的长度是否发生变化

思路:假设数组有重复元素,去重以后,数组的元素个数就少了,那么去重以后的数组的长度就会小于去重前数组长度。当然,若去重前后数组的长度一致,就说明没有重复项。故,书写代码如下:

var containsDuplicate = function (nums) {
    let originLength = nums.length // 1. 获取原始数组长度
    let removeDuplicateLength = [...new Set(nums)].length // 2. 获取去重以后的数组长度
    // 3. 看看两个数组长度是否相等
    if (originLength == removeDuplicateLength) { // 4. 若相等没变化,说明没有重复项
        return false
    } else {
        return true // 5. 若不等,就说明有重复项被去除掉了
    }
};

leetcode提交结果图

总结

对比上述三种解法,我们发现,的确是map集合的效率最好。所以对象和Map集合都可以使用的时候,优先考虑Map集合的使用


水冗水孚
1.1k 声望584 粉丝

每一个不曾起舞的日子,都是对生命的辜负