力扣之存在重複元素

水冗水孚發表於2022-07-19

問題描述

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

相關文章