共计 1523 个字符,预计需要花费 4 分钟才能阅读完成。
问题形容
给你一个整数数组 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 汇合的应用
正文完