Skip to content
文档章节

3175-找到连续赢 K 场比赛的第一位玩家

题目参考: 3175.找到连续赢 K 场比赛的第一位玩家

题目描述

有 n 位玩家在进行比赛,玩家编号依次为 0 到 n - 1 。

给你一个长度为 n 的整数数组 skills 和一个 正 整数 k ,其中 skills[i] 是第 i 位玩家的技能等级。skills 中所有整数 互不相同 。

所有玩家从编号 0 到 n - 1 排成一列。

比赛进行方式如下:

  1. 队列中最前面两名玩家进行一场比赛,技能等级 更高 的玩家胜出。
  2. 比赛后,获胜者保持在队列的开头,而失败者排到队列的末尾。
  3. 这个比赛的赢家是 第一位连续 赢下 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 。

提示:

n == skills.length
2 <= n <= 105
1 <= k <= 109
1 <= skills[i] <= 106
skills 中的整数互不相同。

题解

别被迷惑,题目中说要将比较后的数据移动带最后面,这个操作是不需要的,因为题目中没有说要让我们给出最后序列是什么样的。可做如下思考:

设 maxNum 的序号为 maxNumIndex

  1. 如果 k >= maxNumIndex, 则当找到 maxNum 時,其在首位的位置不会再变化,此时返回 maxNumIndex
  2. 如果 k < maxNumIndex, 则按照题目规则,通过双指针查找即可,直到找到 maxNum ,程序停止,返回 maxNumIndex

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
py
class Solution(object):
  def findWinningPlayer(self, skills, k):
    """
    :type skills: List[int]
    :type k: int
    :rtype: int
    """

    length = len(skills)

    maxNumIndex = 0
    maxNum = skills[0]

    for i in range(1, length):
      if skills[i] > maxNum:
        maxNum = skills[i]
        maxNumIndex = i

    # 如果 k > maxNumIndex, 则在找到 maxNum 之前不可能找到 第 k 大的数, 直接返回 maxNumIndex
    if k > maxNumIndex:
      return maxNumIndex

    # 在 maxNumIndex 之前查找,不需要移动,采用指针

    p = 0
    q = 1
    count = 0
    num = skills[0]

    while p < maxNumIndex and q < maxNumIndex:
      if count == k:
        return p

      if skills[p] > skills[q]:
        count += 1
        q += 1
      else:
        count = 1
        p = q
        q += 1

      if count == k:
        return p
    return maxNumIndex