Leetcode刷题c语言之找到比赛玩家
执行结果:
通过
执行用时和内存消耗
题目:
找到连续赢k场比赛的第一位玩家

思路:
- 初始化:
c用于记录当前玩家连续战胜的玩家数量。i用于遍历数组中的每个玩家。last_i用于记录上一个遍历到的玩家编号,但在原代码中这个变量实际上没有起到应有的作用。
- 外层循环:
- 遍历数组中的每个玩家,以当前玩家为起点,尝试找到连续战胜
k名其他玩家的玩家。
- 遍历数组中的每个玩家,以当前玩家为起点,尝试找到连续战胜
- 内层循环:
- 从当前玩家
i的下一个玩家开始,检查是否有连续的技能值低于当前玩家的玩家。 - 如果找到这样的玩家,
c递增,表示当前玩家又战胜了一名玩家。 - 同时,
j递增,以检查下一个玩家。
- 从当前玩家
- 检查连续胜利次数:
- 如果
c等于k,表示当前玩家连续战胜了k名其他玩家,返回当前玩家的编号。
- 如果
- 重置连续胜利次数和更新遍历索引:
- 如果当前玩家没有连续战胜
k名其他玩家,重置c为1(但这里应该是0,因为对于下一个玩家来说,连续胜利次数应该从0开始计数)。 - 更新
last_i为当前玩家的编号(但这个变量在原代码中没有被正确使用)。 - 更新
i为j,即下一个要检查的玩家的编号。
- 如果当前玩家没有连续战胜
- 返回结果:
- 如果遍历完所有玩家都没有找到满足条件的玩家,返回
last_i(但这里应该返回-1或其他错误代码,因为last_i只是记录了最后一个遍历到的玩家编号,并不能表示赢家)。
- 如果遍历完所有玩家都没有找到满足条件的玩家,返回
int findWinningPlayer(int* skills, int skillsSize, int k) {
int c= 0;
int i = 0, last_i = 0;
while (i < skillsSize) {
int j = i + 1;
while (j < skillsSize && skills[j] < skills[i] && cnt < k) {
j++;
c++;
}
if (c== k) {
return i;
}
c = 1;
last_i = i;
i = j;
}
return last_i;
}
上面代码虽然符合题目要求但仍然有不足
c的重置应该是0而不是1。last_i变量没有被正确使用,且其存在性在原代码中并没有实际意义。- 内层循环中
j++应该在判断条件之后执行,以确保每次循环迭代都进行了比较。但原代码中这个错误实际上并没有出现,因为j++和c++是在同一个代码块中执行的,只是逻辑上的顺序应该更清晰。 - 如果没有找到满足条件的玩家,应该返回-1或其他错误代码。
以下是改进的代码:
int findWinningPlayer(int* skills, int skillsSize, int k)
{
if (k >= skillsSize) {
return -1; // 如果k大于或等于玩家数量,则不可能有玩家连续战胜k名其他玩家
}
int c = 0;
int i = 0;
while (i < skillsSize) {
c= 1; // 从当前玩家开始计数(但这里实际上应该是从0开始计数,不过由于我们检查的是cnt < k,所以初始化为1也可以,但逻辑上更清晰的是从0开始)
int j = i + 1;
while (j < skillsSize && skills[j] < skills[i]) {
c++;
if (c== k) {
return i; // 如果当前玩家连续战胜了k名其他玩家,返回当前玩家的编号 } j++; } i++; // 移动到下一个玩家
}
return -1; // 如果没有找到满足条件的玩家,返回-1
}
更多推荐


所有评论(0)