Class Allocator
-
- All Implemented Interfaces:
public final class Allocator2502 - Design Memory Allocator.
Medium
You are given an integer
nrepresenting the size of a 0-indexed memory array. All memory units are initially free.You have a memory allocator with the following functionalities:
Allocate a block of
sizeconsecutive free memory units and assign it the idmID.Free all memory units with the given id
mID.
Note that:
Multiple blocks can be allocated to the same
mID.You should free all the memory units with
mID, even if they were allocated in different blocks.
Implement the
Allocatorclass:Allocator(int n)Initializes anAllocatorobject with a memory array of sizen.int allocate(int size, int mID)Find the leftmost block ofsizeconsecutive free memory units and allocate it with the idmID. Return the block's first index. If such a block does not exist, return-1.int free(int mID)Free all memory units with the idmID. Return the number of memory units you have freed.
Example 1:
Input "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]
Output: null, 0, 1, 2, 1, 3, 1, 6, 3, -1, 0
Explanation:
Allocator loc = new Allocator(10); // Initialize a memory array of size 10. All memory units are initially free.
loc.allocate(1, 1); // The leftmost block's first index is 0. The memory array becomes **1** ,\_,\_,\_,\_,\_,\_,\_,\_,\_. We return 0.
loc.allocate(1, 2); // The leftmost block's first index is 1. The memory array becomes 1, **2** ,\_,\_,\_,\_,\_,\_,\_,\_. We return 1.
loc.allocate(1, 3); // The leftmost block's first index is 2. The memory array becomes 1,2, **3** ,\_,\_,\_,\_,\_,\_,\_. We return 2.
loc.free(2); // Free all memory units with mID 2. The memory array becomes 1,\_, 3,\_,\_,\_,\_,\_,\_,\_. We return 1 since there is only 1 unit with mID 2.
loc.allocate(3, 4); // The leftmost block's first index is 3. The memory array becomes 1,\_,3, **4** , **4** , **4** ,\_,\_,\_,\_. We return 3.
loc.allocate(1, 1); // The leftmost block's first index is 1. The memory array becomes 1, **1** ,3,4,4,4,\_,\_,\_,\_. We return 1.
loc.allocate(1, 1); // The leftmost block's first index is 6. The memory array becomes 1,1,3,4,4,4, **1** ,\_,\_,\_. We return 6.
loc.free(1); // Free all memory units with mID 1. The memory array becomes \_,\_,3,4,4,4,\_,\_,\_,\_. We return 3 since there are 3 units with mID 1.
loc.allocate(10, 2); // We can not find any free block with 10 consecutive free memory units, so we return -1.
loc.free(7); // Free all memory units with mID 7. The memory array remains the same since there is no memory unit with mID 7. We return 0.
Constraints:
1 <= n, size, mID <= 1000At most
1000calls will be made toallocateandfree.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description public final classAllocator.Node
-
Field Summary
Fields Modifier and Type Field Description private Allocator.Noderoot
-
Method Summary
-
-
Constructor Detail
-
Allocator
Allocator(Integer n)
-
-
-
-