繼第 12 天的「283. Move Zeroes」,今天來解 217 這題!還沒看過第 12 天或再之前天數的朋友,歡迎也去看看~
話不多說,我們開始吧!
給予一個整數陣列,回傳 true 當任何數值出現過兩次。否則回傳 false 。
nums = [1, 2, 3, 1]
1 有出現過兩次,回傳
true
直觀的可以用字典來暫存,優點是取用的時候 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
}
}
令 n 為陣列的長度
Big O | 說明 | |
---|---|---|
時間複雜度 | O(n) | 線性走訪 |
空間複雜度 | O(n) | 需要一個 hash table ,最差情況下會有 n 個元素 |
當然可以用 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
}
}
Big O | 說明 | |
---|---|---|
時間複雜度 | O(n^2) | 視 .contains 需要有 O(n) 加上 for loop 就會是 O(n^2) |
O(n) | 忽略 .contains 的話,就是一個 for loop 的線性走訪 | |
空間複雜度 | O(n) | 需要一個 Set ,最差情況下會有 n 個元素 |
更簡化的話可以這樣想:我們只在意數量
因此只要把陣列轉換成 Set 即可比較元素數量,不需要親自走訪:
class Solution {
func containsDuplicate(_ nums: [Int]) -> Bool {
return Set(nums).count != nums.count
}
}
超差。
令 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 ,
如果有什麼問題和回饋歡迎留言一起討論,今天就到這裡,明天見!