找出数组游戏的赢家

给你一个由 不同 整数组成的整数数组 arr 和一个整数 k 。

每回合游戏都在数组的前两个元素(即 arr[0] 和 arr[1] )之间进行。比较 arr[0] 与 arr[1] 的大小,较大的整数将会取得这一回合的胜利并保留在位置 0 ,较小的整数移至数组的末尾。当一个整数赢得 k 个连续回合时,游戏结束,该整数就是比赛的 赢家 。

返回赢得比赛的整数。

题目数据 保证 游戏存在赢家。

示例 1:

输入:arr = [2,1,3,5,4,6,7], k = 2
输出:5
解释:一起看一下本场游戏每回合的情况:

因此将进行 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
 

提示:

2 <= arr.length <= 10^5
1 <= arr[i] <= 10^6
arr 所含的整数 各不相同 。
1 <= k <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com


一开始想到的是某种排序法,但是修改麻烦,且数量较大时,效率不理想。

可以看到上述材料中,当k非常大,k>len(arr)--arr的元素数量时,结果是最大的数。

那么接下来考虑k<=len(arr)的情况。前些天刚好写了几篇是关于在数组中寻找缺失数字的文章。有点类似略借鉴。

按照题目的描述,总是在第1、2元素间比较得出较大者,然后后面所有元素向前移位,较小者放入数组末尾。

从第1个元素开始,比较后一元素,较大者保留,并记下比较次数+1,直到数组末尾。

这期间,若同一个较大者的比较次数达到k次即完成任务。

如果在比较到数组末尾,同一较大数的比较次数<k怎么办?此时事实已表明该较大数已是数组的最大数,无论再比较多少次,该元素都是较大数。所以该数即解。

# -*- coding: utf-8 -*-
#!/usr/bin/env python

"""
Created on Sun Aug  2 10:40:18 2020

@author: WowlNAN

@github: https://github.com/WowlNAN

@blog: https://blog.csdn.net/qq_21264377

"""


class Solution:
    def getWinner(self, arr, k: int) -> int:
        a=arr.copy()
        l=len(a)
        if k<=l:
            m=a[0]
            b=0
            for i in range(1,l):
                if m>a[i]:
                    b+=1
                else:
                    m=a[i]
                    b=1
                if b==k:
                    return m
            return m
        else:
            return max(a)

猜你喜欢

转载自blog.csdn.net/qq_21264377/article/details/107746646
今日推荐