列表

详情


100297. 找到连续赢 K 场比赛的第一位玩家

有 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] 。比赛过程如下:

玩家 2 连续赢了 k = 2 场比赛,所以赢家是玩家 2 。

示例 2:

输入:skills = [2,5,4], k = 3

输出:1

解释:

一开始,队列里的玩家为 [0,1,2] 。比赛过程如下:

玩家 1 连续赢了 k = 3 场比赛,所以赢家是玩家 1 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int findWinningPlayer(vector<int>& skills, int k) { } };

rust 解法, 执行用时: 8 ms, 内存消耗: 3.6 MB, 提交时间: 2024-10-24 09:00:48

impl Solution {
    pub fn find_winning_player(skills: Vec<i32>, k: i32) -> i32 {
        let mut max_i = 0;
        let mut win = 0;
        for i in 1..skills.len() {
            if skills[i] > skills[max_i] { // 打擂台,发现新的最大值
                max_i = i;
                win = 0;
            }
            win += 1; // 获胜回合 +1
            if win == k { // 连续赢下 k 场比赛
                break;
            }
        }
        // 如果 k 很大,那么 max_i 就是 skills 最大值的下标,毕竟最大值会一直赢下去
        max_i as _
    }
}

javascript 解法, 执行用时: 1 ms, 内存消耗: 64.9 MB, 提交时间: 2024-10-24 09:00:34

/**
 * @param {number[]} skills
 * @param {number} k
 * @return {number}
 */
var findWinningPlayer = function(skills, k) {
    let maxI = 0, win = 0;
    for (let i = 1; i < skills.length && win < k; i++) {
        if (skills[i] > skills[maxI]) { // 打擂台,发现新的最大值
            maxI = i;
            win = 0;
        }
        win++; // 获胜回合 +1
    }
    // 如果 k 很大,那么 maxI 就是 skills 最大值的下标,毕竟最大值会一直赢下去
    return maxI;
};

java 解法, 执行用时: 1 ms, 内存消耗: 59.1 MB, 提交时间: 2024-06-10 00:31:58

class Solution {
    public int findWinningPlayer(int[] skills, int k) {
        int mxI = 0;
        int win = 0;
        for (int i = 1; i < skills.length && win < k; i++) {
            if (skills[i] > skills[mxI]) { // 新的最大值
                mxI = i;
                win = 0;
            }
            win++; // 获胜回合 +1
        }
        return mxI;
    }
}

cpp 解法, 执行用时: 147 ms, 内存消耗: 116.3 MB, 提交时间: 2024-06-10 00:31:44

class Solution {
public:
    int findWinningPlayer(vector<int>& skills, int k) {
        int mx_i = 0, win = 0;
        for (int i = 1; i < skills.size() && win < k; i++) {
            if (skills[i] > skills[mx_i]) { // 新的最大值
                mx_i = i;
                win = 0;
            }
            win++; // 获胜回合 +1
        }
        return mx_i;
    }
};

golang 解法, 执行用时: 117 ms, 内存消耗: 8.4 MB, 提交时间: 2024-06-10 00:31:30

func findWinningPlayer(skills []int, k int) (mxI int) {
	win := 0
	for i := 1; i < len(skills) && win < k; i++ {
		if skills[i] > skills[mxI] { // 新的最大值
			mxI = i
			win = 0
		}
		win++ // 获胜回合 +1
	}
	return
}

python3 解法, 执行用时: 89 ms, 内存消耗: 29 MB, 提交时间: 2024-06-10 00:31:17

class Solution:
    def findWinningPlayer(self, skills: List[int], k: int) -> int:
        mx_i = 0
        win = -1  # 对于 skills[0] 来说,需要连续 k+1 个回合都是最大值
        for i, x in enumerate(skills):
            if x > skills[mx_i]:  # 新的最大值
                mx_i = i
                win = 0
            win += 1  # 获胜回合 +1
            if win == k:
                break
        return mx_i

上一题