这道题每一次比较,都将较小值放到数组最后,将最大值放到数组第一位,下标的变化满足循环数组
的下标变化规律,除此之外,这道题有个隐含的条件,就是当 k 的值大于等于 n - 1的时候,就是在
求整个数组的最大值
class Solution {
public:
int getWinner(vector<int>& arr, int k) {
int i = 0, z = 1, n = arr.size(); // z 是胜出次数记录器
/*
判断是不是求解最大值的那种情况
*/
if(k >= n - 1)
{
int max = arr[0];
while(z < n)
{
if(max < arr[z])
{
max = arr[z];
}
++z;
}
return max;
}
/*
如果不是求最大值的情况,那么就将局部最大值放到 arr[0] 中,每次通过循环下标完成
与 arr[0] 的比较与更新,需要注意的是,循环下标 z 不可以取到 0
*/
z = 1; // 循环数组下标
while(i != k)
{
if(arr[0] > arr[z])
{
z = (z + 1) % n;
if(z == 0)
{
z = 1;
}
++i;
}
else
{
swap(arr[0], arr[z]);
z = (z + 1) % n;
if(z == 0)
{
z = 1;
}
i = 1;
}
}
return arr[0];
}
};