一.题目描述
https://leetcode-cn.com/problems/find-the-winner-of-an-array-game/
二.解法
<1>flag初始等于0,记录当前连胜次数,winner记录连胜数字
<2>当flag小于指定次数k时,不断重复比较
<3>比较arr[0]与arr[1],若arr[0]大,flag+1,winner记录arr[0],arr[1]移至末尾。否则flag重置为1,winner=arr[1],arr[0]移至末尾
class Solution(object):
def getWinner(self, arr, k):
flag = 0
while(flag!=k):
if arr[0]>arr[1]:
flag = flag+1
winner = arr[0]
num = arr[1]
for i in range(1,len(arr)-1):
arr[i]=arr[i+1]
arr[len(arr)-1]=num
else:
flag = 1
winner = arr[1]
num = arr[0]
for i in range(0,len(arr)-1):
arr[i]=arr[i+1]
arr[len(arr)-1]=num
return winner
"""
:type arr: List[int]
:type k: int
:rtype: int
"""
提交在执行次比较时1000000000超时
改进:
若k大于arr长度,不需要执行k次操作,winner必为数组中最大值。提交后1000000000的样例通过,但在输入arr很大的时候仍然超时
参考:https://blog.csdn.net/qq_32424059/article/details/108166931
不需要复杂的将较小的数字移至数组末尾的操作,遍历一次数组即可
<1>第一次比较初始arr中arr[0] arr[1]大小,大的保存在winner中,flag初始=1
<2>按照arr顺序,从第三个数字开始和winner比较,(注意:在进入for循环后首先比较当前flag与k,而不在相关处理之后,是为了避免k=1情况出错)
<3>从arr[2]开始依次向后与winner比较,winner大则flag+1,否则更新winner,flag=1
<4>若函数没有在for循环内返回,说明对arr遍历一次后找到的winner连胜次数未达到k ,此时winner为arr中最大值,直接返回。
def getWinner(self, arr, k): winner = max(arr[0],arr[1]) flag = 1 for num in arr[2:]: if winner>num: flag = flag+1 else: winner=num flag=1 return winner