乐趣区

关于leetcode:力扣之存在重复元素

问题形容

给你一个整数数组 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 汇合的应用

退出移动版