比赛的赢家 | 豆包MarsCode AI 刷题

60 阅读3分钟

image.png

问题理解

题目要求在一个数组中模拟一个比赛游戏,每回合比较数组的前两个元素,较大的元素保留在位置0,较小的元素移到数组末尾。游戏继续进行,直到某个元素连续赢得 k 次比赛,这个元素即为比赛的赢家。

数据结构的选择逻辑

  1. 数组:题目中给定的数据结构是数组,因此我们继续使用数组来存储和操作数据。

  2. 变量

    • currentWinner:用于记录当前的赢家。
    • winCount:用于记录当前赢家的连胜次数。

算法步骤

  1. 初始化

    • 将数组的第一个元素设为初始赢家 currentWinner
    • 初始化连胜次数 winCount 为0。
  2. 遍历数组

    • 从数组的第二个元素开始遍历,模拟每回合的比赛。
    • 如果 currentWinner 大于当前元素,则 currentWinner 继续赢得比赛,winCount 加1。
    • 如果 currentWinner 小于当前元素,则更新 currentWinner 为当前元素,并将 winCount 重置为1。
  3. 检查连胜次数

    • 在每回合比赛后,检查 winCount 是否达到 k
    • 如果达到 k,则返回 currentWinner 作为赢家。
  4. 特殊情况处理

    • 如果数组遍历结束仍未找到赢家(理论上不会发生),则返回 currentWinner。 采用java进行解题,代码如下
public class Main {
    public static int solution(int[] arr, int k) {
        int currentWinner = arr[0]; // 初始化当前赢家为数组的第一个元素
        int winCount = 0; // 初始化连胜次数为0
        
        // 遍历数组,模拟比赛
        for (int i = 1; i < arr.length; i++) {
            if (currentWinner > arr[i%arr.length]) {
                // 当前赢家继续赢得比赛
                winCount++;
            } else {
                // 当前赢家输掉比赛,更新赢家和连胜次数
                currentWinner = arr[i];
                winCount = 1; // 新赢家连胜次数为1
            }
            
            // 如果连胜次数达到k,返回当前赢家
            if (winCount == k) {
                return currentWinner;
            }
        }
        
        // 如果循环结束仍未找到赢家,返回当前赢家(这种情况理论上不会发生)
        return currentWinner;
    }

详细步骤解析

  1. 初始化

    • currentWinner = arr[0];:将数组的第一个元素设为初始赢家。
    • winCount = 0;:初始化连胜次数为0。
  2. 遍历数组

    • 使用 for 循环从数组的第二个元素开始遍历:

      java

      for (int i = 1; i < 

      arr.length; i++) {

          // 模拟比赛

      }

    • 在循环中,比较 currentWinner 和当前元素 arr[i]

      • 如果 currentWinner > arr[i],则 currentWinner 继续赢得比赛,winCount 加1:

        java

        if (currentWinner > 

        arr[i]) {

            winCount++;

        }

      • 如果 currentWinner < arr[i],则更新 currentWinner 为当前元素,并将 winCount 重置为1:

        java

        else {

            currentWinner = 

            arr[i];

            winCount = 1;

        }

  3. 检查连胜次数

    • 在每回合比赛后,检查 winCount 是否达到 k

      java

      if (winCount == k) {

          return 

          currentWinner;

      }

  4. 特殊情况处理

    • 如果数组遍历结束仍未找到赢家(理论上不会发生),则返回 currentWinner

复杂度分析

  • 时间复杂度:最坏情况下,数组中的每个元素都会被比较一次,时间复杂度为 O(n),其中 n 是数组的长度。
  • 空间复杂度:只使用了常数级别的额外空间,空间复杂度为 O(1)

总结

通过遍历数组并模拟比赛过程,我们可以有效地找到连续赢得 k 次比赛的元素。这个算法的时间复杂度较低,适合处理较大的数组。 希望这篇笔记对您有所帮助!让我们在青训营学习中共同进步 如果对步骤有所疑惑或发现问题,可以私信我交流解决!!!