問題描述
給你一個整數陣列 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集合的使用