比赛的赢家| 豆包MarsCode AI刷题

105 阅读2分钟

笔记:数组比赛游戏的解决思路


题目背景

我们需要模拟一个数组比赛游戏,其中每回合比赛的规则描述如下:

  1. 比较数组的前两个元素 arr[0]arr[0]arr[0] 和 arr[1]arr[1]arr[1]。
  2. 较大的数字成为赢家,留在数组首位。
  3. 较小的数字移动到数组末尾。
  4. 游戏继续进行,直到某个数字连续获胜 kkk 次。

题目保证比赛一定会有赢家,我们的任务是找出这个数字。


解决思路

1. 模拟比赛过程
  • 比较数组中前两个数字 arr[0]arr[0]arr[0] 和 arr[1]arr[1]arr[1]:

    • 较大的数字继续留在数组首位。
    • 较小的数字移到数组末尾。
  • 记录当前连续获胜的数字和胜利次数。

  • 每次比较后,检查当前赢家是否已经连续获胜 kkk 次。如果达成条件,直接返回当前赢家。

2. 提前结束条件
  • 如果某个数字连续获胜 kkk 次,比赛就可以提前结束,无需继续。
  • 如果 kkk 大于等于数组长度,则数组中的最大值一定是赢家,因为它最终会成为首位并连续获胜。

实现过程

步骤说明
  1. 初始化变量:

    • 假设初始赢家为第一个元素 arr[0]arr[0]arr[0],胜利次数为 0。
    • 遍历数组的其余元素 arr[i]arr[i]arr[i],逐一比较和更新赢家。
  2. 逐一比较:

    • 如果当前元素 arr[i]arr[i]arr[i] 比赢家大,则更新赢家为当前元素,并将胜利次数重置为 1。
    • 如果当前元素 arr[i]arr[i]arr[i] 比赢家小,则赢家胜利次数加 1。
  3. 检查胜利次数:

    • 每次胜利后,检查胜利次数是否已经达到 kkk。如果是,立即返回当前赢家。
  4. 特殊情况优化:

    • 如果 kkk 超过数组长度,最终赢家一定是数组的最大值,因为最大值最终会占据首位并连续获胜。

时间复杂度分析

  • 每回合比赛中,我们只需比较两个数字,并最多遍历整个数组一次。
  • 因此,时间复杂度为 O(n)O(n)O(n),其中 nnn 是数组的长度。

总结

  • 核心思想: 模拟比赛并通过连续胜利次数判断赢家。
  • 关键优化: 当 kkk 超过数组长度,直接返回最大值。
  • 时间复杂度: O(n)O(n)O(n),在大规模数据下表现良好。