题目描述:
有 n 位玩家在进行比赛,玩家编号依次为 0 到 n - 1 。
给你一个长度为 n 的整数数组 skills 和一个 正 整数 k ,其中 skills[i] 是第 i 位玩家的技能等级。skills 中所有整数 互不相同 。
所有玩家从编号 0 到 n - 1 排成一列。
比赛进行方式如下:
- 队列中最前面两名玩家进行一场比赛,技能等级 更高 的玩家胜出。
- 比赛后,获胜者保持在队列的开头,而失败者排到队列的末尾。
这个比赛的赢家是 第一位连续 赢下 k 场比赛的玩家。
请你返回这个比赛的赢家编号。
示例 1:
输入:skills = [4,2,6,3,9], k = 2
输出:2
解释:
一开始,队列里的玩家为 [0,1,2,3,4] 。比赛过程如下:
- 玩家 0 和 1 进行一场比赛,玩家 0 的技能等级高于玩家 1 ,玩家 0 胜出,队列变为
[0,2,3,4,1]。 - 玩家 0 和 2 进行一场比赛,玩家 2 的技能等级高于玩家 0 ,玩家 2 胜出,队列变为
[2,3,4,1,0]。 - 玩家 2 和 3 进行一场比赛,玩家 2 的技能等级高于玩家 3 ,玩家 2 胜出,队列变为
[2,4,1,0,3]。
玩家 2 连续赢了 k = 2 场比赛,所以赢家是玩家 2 。
示例 2:
输入:skills = [2,5,4], k = 3
输出:1
解释:
一开始,队列里的玩家为 [0,1,2] 。比赛过程如下:
- 玩家 0 和 1 进行一场比赛,玩家 1 的技能等级高于玩家 0 ,玩家 1 胜出,队列变为
[1,2,0]。 - 玩家 1 和 2 进行一场比赛,玩家 1 的技能等级高于玩家 2 ,玩家 1 胜出,队列变为
[1,0,2]。 - 玩家 1 和 0 进行一场比赛,玩家 1 的技能等级高于玩家 0 ,玩家 1 胜出,队列变为
[1,2,0]。
玩家 1 连续赢了 k = 3 场比赛,所以赢家是玩家 1 。
解题思路
- 如果k>n,则赢家只能是技能值最高的人。
- 如果其他玩家想获胜,则必须在遇到技能值最高的玩家x之前。
- 我们可以从前到后去遍历玩家 i,判断它能否连续赢下 k 次(其实就是判断它后面的k个数都比它小)。如果能,就直接返回答案 i,不能就继续遍历,直到遇到x就可以结束遍历了。
- 如果当前的 i 不为 0,那么第 i 个玩家最少已经赢了一次,因为与 i 进行比赛的上一个玩家,已经输掉比赛排到了末尾。
代码实现
class Solution {
public:
int findWinningPlayer(vector<int>& skills, int k) {
int n=skills.size();
int maxs=skills[0], maxi=0;
for (int i=1; i<n; i++)
{
if (skills[i] > maxs)
{
maxs = skills[i];
maxi = i;
}
}
if (k > n)
{
return maxi;
}
int now=0, cnt=0, win=0;
for (int i=1; i<maxi; i++)
{
if (skills[now] > skills[i])
{
cnt++;
if (cnt >= k)
{
win = 1;
break;
}
}
else // skills[now] < skills[i]
{
now = i;
cnt=1;
if (cnt >= k)
{
win = 1;
break;
}
}
}
if (win == 1)
{
return now;
}
else return maxi;
}
};
739

被折叠的 条评论
为什么被折叠?



