1535.找出数组游戏的赢家


题目:找出数组游戏的赢家

给你一个由 不同 整数组成的整数数组arr和一个整数k

每回合游戏都在数组的前两个元素(即arr[0]arr[1])之间进行。比较arr[0]arr[1]的大小,较大的整数将会取得这一回合的胜利并保留在位置0,较小的整数移至数组的末尾。当一个整数赢得 k个连续回合时,游戏结束,该整数就是比赛的赢家

返回赢得比赛的整数。

题目数据保证游戏存在赢家。

  • 示例 1:
    找出数组游戏的赢家
输入:arr = [2,1,3,5,4,6,7], k = 2
输出:5
解释:本场游戏每回合的情况如上图:
因此将进行 4 回合比赛,其中 5 是赢家,因为它连胜 2 回合。
  • 示例 2:
输入:arr = [3,2,1], k = 10
输出:3
解释:3 将会在前 10 个回合中连续获胜。
  • 示例 3:
输入:arr = [1,9,8,2,3,7,6,4,5], k = 7
输出:9
  • 示例 4:
输入:arr = [1,11,22,33,44,55,66,77,88,99], k = 1000000000
输出:99
  • 提示:
2 <= arr.length <= 10^5
1 <= arr[i] <= 10^6
arr 所含的整数 各不相同 。
1 <= k <= 10^9

思路

第一遍提交,发现超时,原因是题中k值远大于数组长度,其实当赢得轮数大于数组长度时即可返回;

第二遍提交,发现超时,原因是测试用例中的数组太大,所以用把数组中的元素一个个挪动移位的方法肯定是不行的。

思考后发现,其实就是从头遍历数组,找到一个能连续赢得k次游戏的元素。

代码

public int getWinner(int[] arr, int k) { // 总时间复杂度O(n)
    int count = 0;
    int max = arr[0]; // 假设第一个元素最大
    for (int i = 1; i <= arr.length - 1 && count < k; i++) { // 时间复杂度O(n)
        if (max < arr[i]) { // 擂主(max)守擂失败,max变成新元素(arr[i]),计数(count)归零
            max = arr[i];
            count = 0;
        }
        count++; // 守擂成功,计数(count)加一
    }
    return max;
}

文章作者: cxyexe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 cxyexe !
  目录