算法——1535、找出数组游戏的赢家

这道题每一次比较,都将较小值放到数组最后,将最大值放到数组第一位,下标的变化满足循环数组
的下标变化规律,除此之外,这道题有个隐含的条件,就是当 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];
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值