题目:找出数组游戏的赢家
给你一个由 不同 整数组成的整数数组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;
}