给你一个由 不同 整数组成的整数数组 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)