周賽343。

題目

輸入整數陣列player1和player2,分別代表選手1和2在各局的擊倒數。

一場保齡球共有n個回合,每回合都有10個瓶子。

假設在第i回合打中xi個瓶子,則當回合的得分為:

  • 如果前兩回合中曾經打中10個瓶,則分數為2倍的x
  • 否則為x

總得分為n個回合的總和。

若選手1得分高,回傳1;選手2得分高,回傳2;平手回傳0。

解法

先寫一個函數f來求選手分數。
維護前兩個回合的得分數,只要其中一個是10,就拿兩倍;否則只拿一倍。最後更新前兩回的得分數。

時間複雜度O(N)。
空間複雜度O(1)。

class Solution:
    def isWinner(self, player1: List[int], player2: List[int]) -> int:
        
        def f(p):
            score=0
            pprev=prev=0
            for x in p:
                if pprev==10 or prev==10:
                    score+=x*2
                else:
                    score+=x
                pprev,prev=prev,x
            return score
        
        s1=f(player1)
        s2=f(player2)  
        
        if s1>s2:
            return 1
        
        if s2>s1:
            return 2
        
        return 0