返回

leetcode_390:让解题不再迷茫!一步步教你消除游戏

闲谈

在迷宫般的 LeetCode 世界中,一道道算法难题犹如横亘在你面前的荆棘丛林,让人望而生畏。今天,我们踏上 leetcode_390 这片战场,准备破解消除游戏的奥秘,让你从此化身解题高手!

题目拆解

消除游戏的规则十分简单:

  • 给定一个从 1 到 n 排序的整数数组。
  • 从左到右,每隔一个数字删除一个数字,直到列表的末尾。
  • 接着,从右到左,每隔一个数字删除一个数字,直到列表为空。

解题思路

要解决消除游戏,我们可以采用「模拟」的方法,一步步模拟出消除过程。具体步骤如下:

  1. 初始化: 创建两个布尔数组 is_deletedis_reversed,分别记录每个数字是否被删除以及是否处于逆序遍历状态。
  2. 正序消除: 从左到右遍历数组,每隔一个数字将 is_deleted[i] 标记为 True,表示该数字已被删除。
  3. 逆序消除:is_reversed 标记为 True,表示进入逆序遍历阶段。从右到左遍历数组,每隔一个数字将 is_deleted[i] 标记为 True
  4. 输出结果: 最后,遍历数组,输出所有 is_deleted[i]False 的数字,即未被删除的数字。

代码实现

def eliminate_game(nums):
    n = len(nums)
    is_deleted = [False] * n
    is_reversed = False

    for i in range(n):
        if is_reversed:
            if (i + 1) % 2 == 0:
                is_deleted[i] = True
        else:
            if i % 2 == 0:
                is_deleted[i] = True
        is_reversed = not is_reversed

    return [num for num, deleted in zip(nums, is_deleted) if not deleted]

示例用例

输入:nums = [1, 2, 3, 4, 5, 6, 7]
输出:[1, 2, 4, 5]

总结

通过循序渐进的讲解和清晰的代码实现,我们成功破解了 leetcode_390 的难题。希望这篇文章能成为你算法解题之路上的指明灯,助你轻松应对未来的挑战。让我们一起踏上算法之旅,在代码的世界中尽情挥洒我们的智慧和创造力!