算法打卡(一)------游戏赢家

力扣1535----找出数组游戏的赢家

题目描述:

在这里插入图片描述

实例:

在这里插入图片描述

运行结果:

在这里插入图片描述

解题思路:

其实这道题还是比较简单的,也就是每次比较数组的前两个元素,将较大数放置数组首位,较小的数放置数组末尾。
在这里插入图片描述

这里比较前两个,更新完数组后为2,3,5,4,6,7,1然后我们接着比较的是arr[0]和arr[1]比较的是2和3,大家这时候可以发现,2是上次比较的较大值,而3是上次比较的两个数的后一个值,所以在这里我们就可以用一个数bigger来替代上次比较的较大值,因为我们比较的是较大值,所以较小值对我们是没有影响的,我们可以不用管它。我们只需要将较大值与下一个值进行比较即可。

在这里插入图片描述

这里面我们只需要记录每一次比较的较大值和较大值的次数即可。

当我们遍历完成一遍还没有达到k值的时候,我们这时候再对数组进行观察可以发现。
在这里插入图片描述

当我们遍历一遍后就可以发现数组的首位是数组中的最大值,也就是说当我们的K值过大时也就是大于数组的长度,我们遍历一遍后没有达到K值,但是无论怎么样我们最后数组的最大值一定是在数组的首位,也及时说后面无论再怎么变化,首位的数一定失不会变的,始终是数组最大值。

也可以这么想当k大于数组的长度则结果一定是数组的最大值。

代码实现

public int getWinner(int[] arr, int k) {
    /**
     * 这里有一个非常重要的线索就是,无论目标值是多少,遍历一遍后最大值一定在第一个
     */
    if(arr.length==0) return 0;
    if(arr.length==1) return arr[0];
    int bigger=arr[0];
    int count=0;
    int temp=bigger;
    for(int i=1;i<arr.length;i++)
    {
        bigger=Math.max(bigger,arr[i]);
        if(bigger==temp){
            count++;
        }else{
            temp=bigger;
            count=1;
        }
        if(count==k) return bigger;
    }
    return bigger;
}

猜你喜欢

转载自blog.csdn.net/qq_44762290/article/details/113101286