leetcode 1535. 找出数组游戏的赢家

一.题目描述

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值