2025-01-10:找到连续赢 K 场比赛的第一位玩家。用go语言,有 n 位玩家参与比赛,玩家的编号从 0 到 n - 1。
你将获得一个长度为 n 的整数数组 skills,以及一个正整数 k,其中 skills[i] 表示第 i 位玩家的技能水平。
数组中的所有技能值都是不同的。
玩家按照编号从 0 到 n - 1 排成一列进行比赛。比赛规则如下:
1.队列中最前面的两名玩家进行对决,技能等级高的玩家获胜。
2.比赛结束后,获胜者留在队列前面,而失败者则被移到队列的末尾。
赢家的定义是:首次连续赢得 k 场比赛的玩家。请你返回这名玩家的编号。
n == skills.length。
2 <= n <= 100000。
1 <= k <= 1000000000。
1 <= skills[i] <= 1000000。
skills 中的整数互不相同。
答案2025-01-10:
chatgpt
题目来自leetcode3175。
大体步骤如下:
- 首先在
findWinningPlayer
函数中,初始化计数器cnt
为0,以及设定初始索引i
和lastI
都为0。这里记录了当前遍历的索引和上一个找到连续k胜利的玩家索引。 - 进入循环,在每轮循环中,设定初试比较索引
j
为i+1
,然后在内部循环中,判断比较j
是否小于n且技能是否高于当前玩家,并且计数器cnt
小于k
的情况下,递增j
和cnt
。 - 如果计数器
cnt
达到k
,说明当前玩家赢得了连续k
场比赛,返回当前玩家的索引i
。 - 如果不满足条件,将计数器
cnt
重新设为1(因为当前玩家至少赢了一场比赛),更新上一个找到连续k胜利的玩家索引lastI
为当前玩家的索引i
,并将i
更新为j
继续循环寻找下一位玩家。 - 在主函数
main
中定义了输入的技能数组skills
和整数k
,然后调用findWinningPlayer
函数来找到第一个连续赢得k
场比赛的玩家索引,最后将结果打印出来。
总的时间复杂度是 O(n),在最坏情况下会遍历一遍技能数组。
总的额外空间复杂度是 O(1),因为只使用了常数个额外的变量来跟踪索引和计数器。
Go完整代码如下:
package main
import (
"fmt"
)
func findWinningPlayer(skills []int, k int) int {
n := len(skills)
cnt := 0
i, lastI := 0, 0
for i < n {
j := i + 1
for j < n && skills[j] < skills[i] && cnt < k {
j++
cnt++
}
if cnt == k {
return i
}
cnt = 1
lastI = i
i = j
}
return lastI
}
func main() {
skills := []int{4,2,6,3,9}
k := 2
result := findWinningPlayer(skills,k)
fmt.Println(result)
}
Rust完整代码如下:
fn find_winning_player(skills: Vec<i32>, k: i32) -> usize {
let n = skills.len();
let mut cnt = 0;
let (mut i, mut last_i) = (0, 0);
while i < n {
let mut j = i + 1;
while j < n && skills[j] < skills[i] && cnt < k {
j += 1;
cnt += 1;
}
if cnt == k {
return i;
}
cnt = 1;
last_i = i;
i = j;
}
last_i
}
fn main() {
let skills = vec![4, 2, 6, 3, 9];
let k = 2;
let result = find_winning_player(skills, k);
println!("{}", result);
}
C完整代码如下:
#include <stdio.h>
int findWinningPlayer(int skills[], int n, int k) {
int cnt = 0;
int i, lastI = 0;
for (i = 0; i < n; ) {
int j = i + 1;
while (j < n && skills[j] < skills[i] && cnt < k) {
j++;
cnt++;
}
if (cnt == k) {
return i;
}
cnt = 1;
lastI = i;
i = j;
}
return lastI;
}
int main() {
int skills[] = {4, 2, 6, 3, 9};
int n = sizeof(skills) / sizeof(skills[0]);
int k = 2;
int result = findWinningPlayer(skills, n, k);
printf("%d\n", result);
return 0;
}
C++完整代码如下:
#include <iostream>
#include <vector>
int findWinningPlayer(std::vector<int>& skills, int k) {
int n = skills.size();
int cnt = 0;
int i, lastI = 0;
for (i = 0; i < n; ) {
int j = i + 1;
while (j < n && skills[j] < skills[i] && cnt < k) {
j++;
cnt++;
}
if (cnt == k) {
return i;
}
cnt = 1;
lastI = i;
i = j;
}
return lastI;
}
int main() {
std::vector<int> skills = {4, 2, 6, 3, 9};
int k = 2;
int result = findWinningPlayer(skills, k);
std::cout << result << std::endl;
return 0;
}
Python完整代码如下:
# -*-coding:utf-8-*-
def find_winning_player(skills, k):
n = len(skills)
cnt = 0
i, last_i = 0, 0
while i < n:
j = i + 1
while j < n and skills[j] < skills[i] and cnt < k:
j += 1
cnt += 1
if cnt == k:
return i
cnt = 1
last_i = i
i = j
return last_i
def main():
skills = [4, 2, 6, 3, 9]
k = 2
result = find_winning_player(skills, k)
print(result)
if __name__ == "__main__":
main()
JavaScript完整代码如下:
function findWinningPlayer(skills, k) {
let n = skills.length;
let cnt = 0;
let i, lastI = 0;
for (i = 0; i < n; ) {
let j = i + 1;
while (j < n && skills[j] < skills[i] && cnt < k) {
j++;
cnt++;
}
if (cnt === k) {
return i;
}
cnt = 1;
lastI = i;
i = j;
}
return lastI;
}
const skills = [4, 2, 6, 3, 9];
const k = 2;
const result = findWinningPlayer(skills, k);
console.log(result);