前往
大廳
主題

LeetCode - 2502. Design Memory Allocator 解題心得

Not In My Back Yard | 2023-11-06 12:00:06 | 巴幣 0 | 人氣 78

題目連結:


題目意譯:
你被給定一整數 n 代表著一個索引值從 0 開始的記憶體陣列之長度。所有記憶體單元一開始都是被釋放的(Free)狀態。

你有一個記憶體分配器,其有著以下功能:
將一塊大小為 size 的連續且為被釋放狀態之記憶體單元,並賦予它們 mID 這個 ID 編號;
根據給定的 ID 編號 mID 來釋放對應的記憶體單元。

注意到:
多個區塊可能會得到一樣的 mID;
而你應釋放掉所有有著 mID 的記憶體單元,不論它們是否位於同一區塊中。

實作類別 Allocator:
Allocator(int n) 初始化一個 Allocator 物件,其有著一個大小為 n 的記憶體陣列。
int allocate(int size, int mID) 找到最靠左側的大小為 size 且為被釋放狀態之連續記憶體單元區塊並賦予它們 mID 這個 ID 編號。請回傳這個區塊中做左側元素(第一個)的索引值。如果這個區塊不存在,則回傳 -1。
int free(int mID) 將所有有著 ID 編號 mID 的記憶體單元釋放。請回傳你所釋放的記憶體單元之總數。

限制:
1 ≦ n, size, mID ≦ 1000
最多呼叫 allocate 和 free 1000 次。



範例測資:
範例 1:
輸入
["Allocator", "allocate", "allocate", "allocate", "free", "allocate", "allocate", "allocate", "free", "allocate", "free"]
[[10], [1, 1], [1, 2], [1, 3], [2], [3, 4], [1, 1], [1, 1], [1], [10, 2], [7]]
輸出
[null, 0, 1, 2, 1, 3, 1, 6, 3, -1, 0]
解釋
Allocator loc = new Allocator(10); // 初始化一個大小為 10 的記憶體陣列。所有記憶體單元一開始都是釋放狀態。
loc.allocate(1, 1); // 最左側的區塊第一個索引值為 0。記憶體陣列變成 [1,_,_,_,_,_,_,_,_,_]。我們回傳 0。
loc.allocate(1, 2); // 最左側的區塊第一個索引值為 1。記憶體陣列變成 [1,2,_,_,_,_,_,_,_,_]。我們回傳 1。
loc.allocate(1, 3); // 最左側的區塊第一個索引值為 2。記憶體陣列變成 [1,2,3,_,_,_,_,_,_,_]。我們回傳 2。
loc.free(2); // 釋放掉所有有著 ID 編號 2 的記憶體單元。記憶體陣列變成 [1,_,3,_,_,_,_,_,_,_]。我們回傳 1,因為只有一個單元的 ID 編號是 2。
loc.allocate(3, 4); // 最左側的區塊第一個索引值為 3。記憶體陣列變成 [1,_,3,4,4,4,_,_,_,_]。我們回傳 3。
loc.allocate(1, 1); // 最左側的區塊第一個索引值為 1。記憶體陣列變成 [1,1,3,4,4,4,_,_,_,_]。我們回傳 1。
loc.allocate(1, 1); // 最左側的區塊第一個索引值為 6。記憶體陣列變成 [1,1,3,4,4,4,1,_,_,_]。我們回傳 6。
loc.free(1); // 釋放掉所有有著 ID 編號 1 的記憶體單元。記憶體陣列變成 [_,_,3,4,4,4,_,_,_,_]。我們回傳 3,因為只有三個單元的 ID 編號是 1。
loc.allocate(10, 2); // 我們沒辦法找到一塊已經被釋放的且為連續 10 個單元在一起的區塊,所以我們回傳 -1。
loc.free(7); // 釋放掉所有有著 ID 編號 7 的記憶體單元。因為沒有記憶體單元的 ID 編號是 7,所以記憶體陣列維持不變。我們回傳 0。


解題思維:
直接模擬即可。也就是直接宣告一個大小為 n 的整數陣列來儲存每一個單元的當前 ID 編號(由於本題 mID 不會是 0,因此可以用數字 0 來代表那些已經被釋放的單元們)。然後當:
    呼叫 allocate 時,就是直接由左往右掃過一次陣列看有沒有連續的 size 個 0(代表著有連續的 size 個已經被釋放之單元存在)。如果沒有則直接回傳 -1;反之,則掃過一次這些先被找到的 size 個單元,並在陣列中為它們賦予對應的 ID 編號值。最後回傳第一個索引值即可。

    呼叫 free 時,就是掃過整個陣列,看哪些位置編號目前是 mID。每看到一個就把計數器 + 1(初始值是 0)並將該位置的 ID 編號重設為 0。最後回傳計數器之值即可。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作