夯实算法-增长的内存泄露

191 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

题目:LeetCode

给你两个整数 memory1 和 memory2 分别表示两个内存条剩余可用内存的位数。现在有一个程序每秒递增的速度消耗着内存。

在第 i 秒(秒数从 1 开始),有 i 位内存被分配到 剩余内存较多 的内存条(如果两者一样多,则分配到第一个内存条)。如果两者剩余内存都不足 i 位,那么程序将 意外退出 。

请你返回一个数组,包含 [crashTime, memory1crash, memory2crash] ,其中 crashTime是程序意外退出的时间(单位为秒), memory1crash 和 memory2crash 分别是两个内存条最后剩余内存的位数。

示例 1:

输入:memory1 = 2, memory2 = 2
输出:[3,1,0]
解释:内存分配如下:
- 第 1 秒,内存条 1 被占用 1 位内存。内存条 1 现在有 1 位剩余可用内存。
- 第 2 秒,内存条 2 被占用 2 位内存。内存条 2 现在有 0 位剩余可用内存。
- 第 3 秒,程序意外退出,两个内存条分别有 1 位和 0 位剩余可用内存。

示例 2:

输入:memory1 = 8, memory2 = 11
输出:[6,0,4]
解释:内存分配如下:
- 第 1 秒,内存条 2 被占用 1 位内存,内存条 2 现在有 10 位剩余可用内存。
- 第 2 秒,内存条 2 被占用 2 位内存,内存条 2 现在有 8 位剩余可用内存。
- 第 3 秒,内存条 1 被占用 3 位内存,内存条 1 现在有 5 位剩余可用内存。
- 第 4 秒,内存条 2 被占用 4 位内存,内存条 2 现在有 4 位剩余可用内存。
- 第 5 秒,内存条 1 被占用 5 位内存,内存条 1 现在有 0 位剩余可用内存。
- 第 6 秒,程序意外退出,两个内存条分别有 0 位和 4 位剩余可用内存。

提示:

  • 0<=memory1,memory2<=231 10 <= memory1, memory2 <= 2^31 - 1

解题思路

使用变量i模拟时间的运行,根据当前memory的数量对比,决定分配哪个内存。持续前述过程,直至无法分配内存。

代码实现

 public int[] memLeak(int memory1, int memory2) {
    int[] ans = new int[3];
    int time = 1;   // 时间从 1 开始
    while (true) {
        // 如果 1 中的剩余位数大于等于 2 中的,那么尝试往 1 中放
        if (memory1 >= memory2) {
            // 如果 1 中剩余的空间不够放了,就直接返回
            if (memory1 < time) {
                ans[0] = time;
                ans[1] = memory1;
                ans[2] = memory2;
                return ans;
            }
            // 否则就直接减去相应的空间
            memory1 -= time;
        } else {
            // 同上
            if (memory2 < time) {
                ans[0] = time;
                ans[1] = memory1;
                ans[2] = memory2;
                return ans;
            }
            memory2 -= time;
        }
        time++;
    }
}

复杂度分析

  • 时间复杂度:O(sqrt(n))O(sqrt(n))
  • 空间复杂度:O(1)O(1)

掘金(JUEJIN)  一起分享知识, Keep Learning!