给你一个由 不同 整数组成的整数数组 arr 和一个整数 k 。
每回合游戏都在数组的前两个元素(即 arr[0] 和 arr[1] )之间进行。比较 arr[0] 与 arr[1] 的大小,较大的整数将会取得这一回合的胜利并保留在位置 0 ,较小的整数移至数组的末尾。当一个整数赢得 k 个连续回合时,游戏结束,该整数就是比赛的赢家 。返回赢得比赛的整数。
题目数据 保证 游戏存在赢家。
注:
2 <= arr.length <= 10^5
1 <= arr[i] <= 10^6
arr 所含的整数 各不相同 。
1 <= k <= 10^9
示例 1:
输入:arr = [2,1,3,5,4,6,7], k = 2
输出:5
解释:一起看一下本场游戏每回合的情况:
回合 数组 获胜整数 连胜回合数
1 [2,1,3,5,4,6,7] 2 1
2 [2,3,5,4,6,7,1] 3 1
3 [3,5,4,6,7,1,2] 5 1
4 [5,4,6,7,1,2,3] 5 2
因此将进行 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
package com.loo;
public class FindWinner {
public static void main(String[] args) {
int[] arr1 = {2,1,3,5,4,6,7};
int[] arr2 = {3,2,1};
int[] arr3 = {1,9,8,2,3,7,6,4,5};
int[] arr4 = {1,11,22,33,44,55,66,77,88,99};
int k = 2;
if (arr1!=null && arr1.length>0) {
System.out.println(getWinner1(arr1 , k));
System.out.println(getWinner2(arr1 , k));
}
}
// 如果 prev>currNumber,则 prev 不变,将 continueWinCount 的值加 1,如果 continueWinCount 的值更新之后等于 k,
// 则 prev 赢得 k 个连续回合,成为游戏的赢家,将 prev 返回即可;
// 如果 prev<currNumber,则 currNumber 取得胜利,令 prev=currNumber,并将 continueWinCount 的值更新为 1。
public static int getWinner1(int[] arr , int k) {
int prev = Math.max(arr[0] , arr[1]);
if (k == 1) {
return prev;
}
int continueWinCount = 1;
int maxNumber = prev;
for (int i=2;i<arr.length;i++) {
int currNumber = arr[i];
if (prev > currNumber) {
continueWinCount++;
if (continueWinCount == k) {
return prev;
}
} else {
prev = currNumber;
continueWinCount = 1;
}
maxNumber = Math.max(maxNumber , currNumber);
}
return maxNumber;
}
// 最后 arr[i] 都改变为当前数组最大者即可
public static int getWinner2(int[] arr , int k) {
int times = 0;
int i = 0;
while (times<k && i<arr.length-1) {
if (arr[i] > arr[i+1]) {
arr[i+1] = arr[i];
times ++;
} else {
i++;
times = 1;
}
}
return arr[i];
}
}