基於時間的鍵值對儲存 | Medium | LeetCode#981. Time Based Key-Value Store
題目敘述

- 題目難度:
Medium - 題目描述: 題目要求設計一個 time-based 的 key-value 儲存結構,可以相同key可以儲存多種值並且對於相同Key可以有多個不同的timestamp,並且用戶可以透過特定 timestamp 獲取值
請實踐一個 TimeMap class:
TimeMap()用於初始化物件void set(String key, String value, int timestamp): 在給定timestamp條件下, 儲存value到對應到特定的key上String get(String key, int timestamp): 回傳先前透過set函數儲存的值,並且請找出小於等於當前timestamp的timestamp。如果有多個值,請回傳具有最大但小於timestamp的 timestamp 值。若沒有值,則回傳""
解法
我的解法
1 | class TimeMap { |
我的想法也蠻簡單的,其實就是要先有個結構能夠同時有key跟value 跟不同的 timestamp,直覺想到使用 Hash Table 只是可能要變化一下,首先宣告成員變數 umap 這邊希望儲存結構會是長成 {key, {value, timestamp}}
1 | unordered_map<string, vector<pair<string, int>>> umap |
在 set 函數就比較直覺,直接把input 中的 value, timestamp 包成pair 放入 umap[key] 這邊由於是 push_back 且題目呼叫的 timestamp 會是由小到大呼叫,因此在 umap[key] 當中的pair中的timestamp 會是嚴格由小到大排序。
再來是 get 函數,這邊如果在 umap 中找不到 key 就會直接回傳 ""。如果有找到,由於已經排序好了,因此目標要找小於當前的 timestamp 值中最大的那個,因此 已排序陣列找特定元素,要用 Binary Search, 這邊宣告兩個變數 left 和 right來執行二元搜尋。
1 | while(left <= right){ |
這邊一旦發現中間值的 timestamp 比input的 timestamp值大,那就需要收窄 right,而如果中間值的 timestamp 比input的 timestamp值小,代表我們在正確的範圍,需要持續收窄 left 並且將 returnString 指定為 value (umap[key][mid].first) 步驟持續直到搜索完畢,最後回傳 returnString
執行結果

複雜度
時間複雜度 $O(LogN)$
空間複雜度 $O(N)$
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 Kevin Liu's 部落格 || Technical || Travel!
評論










