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

解题方法:部分模拟

首先我们部分模拟这个“比赛”过程,其中“部分”是指:

  1. 只遍历一遍数组,当所有元素都参赛过至少一次时,模拟就停止
  2. 只模拟赢家不关心输家,用变量记录赢家及连胜次数,输家直接丢掉

如果在上面的模拟中出现了$k$连胜者,那么直接返回,算法结束。否则开始脑筋急转弯:

请你想,数组都遍历过一遍了,那么最大的元素一定变成了arr[0]

由于数组中每个元素各不相同,因此其他元素永无翻身之日,这个元素必定不会输。

所以,不论要连胜多少轮,连胜者都将会是这个元素

也就是说,遍历一遍数组模拟结束时若未有$k$连胜者,那么当前胜者(数组中最大的数)将会是第一个$k$连胜者。

  • 时间复杂度$O(len(arr))$
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
int getWinner(vector<int>& arr, int k) {
int winner = arr[0], winTime = 0;
for (int i = 1; i < arr.size(); i++) {
if (winner > arr[i]) {
winTime++;
}
else {
winner = arr[i];
winTime = 1;
}
if (winTime == k) {
return winner;
}
}
return winner;
}
};

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# from typing import List

class Solution:
def getWinner(self, arr: List[int], k: int) -> int:
winner, winTime = arr[0], 0
for i in range(1, len(arr)):
if winner > arr[i]:
winTime += 1
else:
winner = arr[i]
winTime = 1
if winTime == k:
return winner
return winner

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/139040126


1535.找出数组游戏的赢家
https://blog.letmefly.xyz/2024/05/19/LeetCode 1535.找出数组游戏的赢家/
作者
Tisfy
发布于
2024年5月19日
许可协议