问题描述
给你一个整数数组 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. 若不等,就说明有重复项被去除掉了
}
};
总结
对比上述三种解法,我们发现,的确是map集合的效率最好。所以对象和Map集合都可以使用的时候,优先考虑Map集合的使用