iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
Mobile Development

30天用 Swift 解 LeetCode 問題系列 第 13

Day 13 - 217. Contains Duplicate - 解法與複雜度分析 - LeetCode in Swift

  • 分享至 

  • xImage
  •  

hero

繼第 12 天的「283. Move Zeroes」,今天來解 217 這題!還沒看過第 12 天或再之前天數的朋友,歡迎也去看看~

話不多說,我們開始吧!

基本資訊

演算法與資料結構

  • Array
  • Hash Table

題意

給予一個整數陣列,回傳 true 當任何數值出現過兩次。否則回傳 false 。

範例

nums = [1, 2, 3, 1]

1 有出現過兩次,回傳

true

1. Dictionary

直觀的可以用字典來暫存,優點是取用的時候 O(1)

class Solution {
    func containsDuplicate(_ nums: [Int]) -> Bool {
        var hashTable = [Int: Bool]()
        for number in nums {
            if hashTable[number] != nil {
                return true
            } else {
                hashTable[number] = true
            }
        }
        return false
    }
}

執行結果

  • Runtime: 623 ms (Beats: 35.94%)
  • Memory: 19.5 MB (Beats 20.78%)

複雜度分析

令 n 為陣列的長度

Big O 說明
時間複雜度 O(n) 線性走訪
空間複雜度 O(n) 需要一個 hash table ,最差情況下會有 n 個元素

2. Set

當然可以用 Set ,速度上有快一些?

class Solution {
    func containsDuplicate(_ nums: [Int]) -> Bool {
        var hashTable = Set<Int>()
        
        for number in nums {
            if hashTable.contains(number) {
                return true
            } else {
                hashTable.insert(number)
            }
        }
        return false
    }
}

執行結果

  • Runtime: 583ms (Beats 72.60%)
  • Memory: 18.9MB (Beats 35.87%)

複雜度分析

Big O 說明
時間複雜度 O(n^2) 視 .contains 需要有 O(n) 加上 for loop 就會是 O(n^2)
O(n) 忽略 .contains 的話,就是一個 for loop 的線性走訪
空間複雜度 O(n) 需要一個 Set ,最差情況下會有 n 個元素

3. 一行解

更簡化的話可以這樣想:我們只在意數量

因此只要把陣列轉換成 Set 即可比較元素數量,不需要親自走訪:

class Solution {
    func containsDuplicate(_ nums: [Int]) -> Bool {
        return Set(nums).count != nums.count
    }
}

執行結果

  • Runtime: 868 ms (Beats 9.68%)
  • Memory: 18.6 MB (Beats 79.22%)

超差。

複雜度分析

令 n 為陣列的長度

Big O 說明
時間複雜度 O(n) 需要建立 Set
空間複雜度 O(n) 需要建立 Set

比較

解法 時間複雜度 Runtime 空間複雜度 Memory
Dictionary O(n2) 623 ms O(n) 19.5 MB
Set O(n) 583 ms O(n) 18.9 MB
一行解 O(n) 868 ms O(n) 18.6 MB

在一行解可以看到花了超多時間,送出的時候的確還有等待的空擋。推測是在初始化 Set 的時候花了比較多的計算資源。

結語

以上,就是今天的 LeetCode in Swift ,

如果有什麼問題和回饋歡迎留言一起討論,今天就到這裡,明天見!


上一篇
Day 12 - 283. Move Zeroes - 解法與複雜度分析 - LeetCode in Swift
下一篇
Day 14 - 695. Max Area of Island - 解法與複雜度分析 - LeetCode in Swift
系列文
30天用 Swift 解 LeetCode 問題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言