笔记:数组比赛游戏的解决思路
题目背景
我们需要模拟一个数组比赛游戏,其中每回合比赛的规则描述如下:
- 比较数组的前两个元素 arr[0]arr[0]arr[0] 和 arr[1]arr[1]arr[1]。
- 较大的数字成为赢家,留在数组首位。
- 较小的数字移动到数组末尾。
- 游戏继续进行,直到某个数字连续获胜 kkk 次。
题目保证比赛一定会有赢家,我们的任务是找出这个数字。
解决思路
1. 模拟比赛过程
-
比较数组中前两个数字 arr[0]arr[0]arr[0] 和 arr[1]arr[1]arr[1]:
- 较大的数字继续留在数组首位。
- 较小的数字移到数组末尾。
-
记录当前连续获胜的数字和胜利次数。
-
每次比较后,检查当前赢家是否已经连续获胜 kkk 次。如果达成条件,直接返回当前赢家。
2. 提前结束条件
- 如果某个数字连续获胜 kkk 次,比赛就可以提前结束,无需继续。
- 如果 kkk 大于等于数组长度,则数组中的最大值一定是赢家,因为它最终会成为首位并连续获胜。
实现过程
步骤说明
-
初始化变量:
- 假设初始赢家为第一个元素 arr[0]arr[0]arr[0],胜利次数为 0。
- 遍历数组的其余元素 arr[i]arr[i]arr[i],逐一比较和更新赢家。
-
逐一比较:
- 如果当前元素 arr[i]arr[i]arr[i] 比赢家大,则更新赢家为当前元素,并将胜利次数重置为 1。
- 如果当前元素 arr[i]arr[i]arr[i] 比赢家小,则赢家胜利次数加 1。
-
检查胜利次数:
- 每次胜利后,检查胜利次数是否已经达到 kkk。如果是,立即返回当前赢家。
-
特殊情况优化:
- 如果 kkk 超过数组长度,最终赢家一定是数组的最大值,因为最大值最终会占据首位并连续获胜。
时间复杂度分析
- 每回合比赛中,我们只需比较两个数字,并最多遍历整个数组一次。
- 因此,时间复杂度为 O(n)O(n)O(n),其中 nnn 是数组的长度。
总结
- 核心思想: 模拟比赛并通过连续胜利次数判断赢家。
- 关键优化: 当 kkk 超过数组长度,直接返回最大值。
- 时间复杂度: O(n)O(n)O(n),在大规模数据下表现良好。