题目描述
有一个总空间为100字节的堆,现要从中新申请一块内存,内存分配原则为:优先紧接着前一块已使用内存,分配空间足够且最接近申请大小的空闲内存。
输入描述
第1行是1个整数,表示期望申请的内存字节数
第2到第N行是用空格分割的两个整数,表示当前已分配的内存的情况,每一行表示一块已分配的连续内存空间,每行的第1和第2个整数分别表示偏移地址和内存块大小,如:
0 1
3 2
表示 0 偏移地址开始的 1 个字节和 3 偏移地址开始的 2 个字节已被分配,其余内存空闲。
输出描述
若申请成功,输出申请到内存的偏移;
若申请失败,输出 -1
备注:
- 若输入信息不合法或无效,则申请失败
- 若没有足够的空间供分配,则申请失败
- 堆内存信息有区域重叠或有非法值等都是无效输入
用例
输入 | 1 0 1 3 2 |
---|---|
输出 | 1 |
说明 | 堆中已使用的两块内存是偏移从0开始的1字节和偏移从3开始的2字节,空闲的两块内存是偏移从1开始2个字节和偏移从5开始95字节,根据分配原 |
解题思路
-
内存块排序:
- 将
usedMemory
列表中的内存块按起始地址进行排序。这样可以更容易地找到连续的空闲内存区域。
- 将
-
寻找最佳匹配内存块:
- 程序初始化一个变量
start
(起始地址)为0,bestFitStart
(最佳匹配起始地址)为-1,以及minSizeDiff
(最小大小差异)为最大整数值。 - 然后,它遍历已排序的内存块列表。对于每个内存块,程序执行以下操作:
- 检查内存块的合法性(起始地址是否有效,大小是否合理)。
- 计算当前可用的空闲空间(
freeSpace
)。 - 如果这个空闲空间足够大并且比之前找到的空间更接近申请大小,则更新
bestFitStart
和minSizeDiff
。
- 程序初始化一个变量