其实仔细想清楚这个过程可以发现,当k比较大时,最后答案就是数组的最大值,因此,不需要真的像题目描述的那样去更换数组中元素的位置,那样肯定会超时(别问我怎么知道的,问就是最开始这样写然后超时了),后来想通了,只需要更改下标进行比较就可以了。
原题传送门
【题目描述】
给你一个由 不同 整数组成的整数数组 arr 和一个整数 k 。
每回合游戏都在数组的前两个元素(即 arr[0] 和 arr[1] )之间进行。比较 arr[0] 与 arr[1] 的大小,较大的整数将会取得这一回合的胜利并保留在位置 0 ,较小的整数移至数组的末尾。当一个整数赢得 k 个连续回合时,游戏结束,该整数就是比赛的 赢家 。
返回赢得比赛的整数。
题目数据 保证 游戏存在赢家。
【示例】
【解题过程】
【思路】
见代码注释
【代码】
class Solution {
public:
int getWinner(vector<int>& arr, int k) {
int count=0;//记录当前赢家的连续胜利次数
int i=2;//遍历数组的下标
int cmp1=arr[0],cmp2=arr[1];//两个进行比较的数字,cmp1为题干中的arr[0],cmp2是每次改变后的arr[1],这里并不对数组进行移动,只是逻辑上改下标进行移动
while(1){
if(cmp1<cmp2){//cmp1发生改变
cmp1=cmp2;
count=1;
}
else{//cmp1不变
count++;
}
if(count==k || count>arr.size()){//当达到获胜次数为k,或者,次数大于数组长度,当次数大于数组长度,后面arr[0]都不会变,都是数组的最大值,因此可以直接返回。
return cmp1;
}
cmp2=arr[i];
if(i<arr.size()){
i++;
}
else{//数组遍历完成,count还未到达k,但是没必要继续比了,此时cmp1一定是数组最大值,后面继续比也不会发生改变,可以直接返回。
return cmp1;
}
}
}
};
运行结果: