力扣之存在重复元素

问题描述 给你一个整数数组 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. 看看此项是否在对象中。对象中是否有某个属性名keykey 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集合的使用

    推荐阅读