1535.找出数组游戏的赢家
【LetMeFly】1535.找出数组游戏的赢家:脑筋急转弯(部分模拟)
力扣题目链接:https://leetcode.cn/problems/find-the-winner-of-an-array-game/
给你一个由 不同 整数组成的整数数组 arr
和一个整数 k
。
每回合游戏都在数组的前两个元素(即 arr[0]
和 arr[1]
)之间进行。比较 arr[0]
与 arr[1]
的大小,较大的整数将会取得这一回合的胜利并保留在位置 0
,较小的整数移至数组的末尾。当一个整数赢得 k
个连续回合时,游戏结束,该整数就是比赛的 赢家 。
返回赢得比赛的整数。
题目数据 保证 游戏存在赢家。
示例 1:
输入:arr = [2,1,3,5,4,6,7], k = 2 输出:5 解释:一起看一下本场游戏每回合的情况: 因此将进行 4 回合比赛,其中 5 是赢家,因为它连胜 2 回合。
示例 2:
输入:arr = [3,2,1], k = 10 输出:3 解释:3 将会在前 10 个回合中连续获胜。
示例 3:
输入:arr = [1,9,8,2,3,7,6,4,5], k = 7 输出:9
示例 4:
输入:arr = [1,11,22,33,44,55,66,77,88,99], k = 1000000000 输出:99
提示:
2 <= arr.length <= 10^5
1 <= arr[i] <= 10^6
arr
所含的整数 各不相同 。1 <= k <= 10^9
解题方法:部分模拟
首先我们部分模拟这个“比赛”过程,其中“部分”是指:
- 只遍历一遍数组,当所有元素都参赛过至少一次时,模拟就停止
- 只模拟赢家不关心输家,用变量记录赢家及连胜次数,输家直接丢掉
如果在上面的模拟中出现了$k$连胜者,那么直接返回,算法结束。否则开始脑筋急转弯:
请你想,数组都遍历过一遍了,那么最大的元素一定变成了
arr[0]
。由于数组中每个元素各不相同,因此其他元素永无翻身之日,这个元素必定不会输。
所以,不论要连胜多少轮,连胜者都将会是这个元素。
也就是说,遍历一遍数组模拟结束时若未有$k$连胜者,那么当前胜者(数组中最大的数)将会是第一个$k$连胜者。
- 时间复杂度$O(len(arr))$
- 空间复杂度$O(1)$
AC代码
C++
1 |
|
Python
1 |
|
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/139040126
1535.找出数组游戏的赢家
https://blog.letmefly.xyz/2024/05/19/LeetCode 1535.找出数组游戏的赢家/