保龄球游戏的获胜者(LeetCode日记)

LeetCode-2660-保龄球游戏的获胜者

题目信息:

给你两个下标从 0 开始的整数数组 p l a y e r 1 player1 player1 p l a y e r 2 player2 player2 ,分别表示玩家 1 和玩家 2 击中的瓶数。

保龄球比赛由 n n n 轮组成,每轮的瓶数恰好为 10 10 10

  • 假设玩家在第 i i i 轮中击中 x i x_i xi 个瓶子。玩家第 i i i 轮的价值为:
  • 如果玩家在该轮的前两轮的任何一轮中击中了 10 个瓶子,则为 2 x i 2x_i 2xi
    否则,为 x i x_i xi

玩家的得分是其 n n n 轮价值的总和。

返回

  • 如果玩家 1 的得分高于玩家 2 的得分,则为 1 ;
  • 如果玩家 2 的得分高于玩家 1 的得分,则为 2 ;
  • 如果平局,则为 0 。

  • 示例1:

输入: p l a y e r 1 player1 player1 = [4,10,7,9], p l a y e r 2 player2 player2 = [6,5,2,3]
输出:1
解释: p l a y e r 1 player1 player1 的得分是 4 + 10 + 27 + 29 = 46 。
p l a y e r 2 player2 player2 的得分是 6 + 5 + 2 + 3 = 16 。
p l a y e r 1 player1 player1 的得分高于 p l a y e r 2 player2 player2 的得分,所以 p l a y 1 play1 play1 在比赛中获胜,答案为 1 。

  • 示例2:

输入: p l a y e r 1 player1 player1 = [3,5,7,6], p l a y e r 2 player2 player2 = [8,10,10,2]
输出:2
解释: p l a y e r 1 player1 player1 的得分是 3 + 5 + 7 + 6 = 21 。
p l a y e r 2 player2 player2 的得分是 8 + 10 + 210 + 22 = 42 。
p l a y e r 2 player2 player2 的得分高于 player1 的得分,所以 p l a y 2 play2 play2 在比赛中获胜,答案为 2 。

  • 示例3:

输入: p l a y e r 1 player1 player1 = [2,3], p l a y e r 2 player2 player2 = [4,1]
输出:0
解释: p l a y e r 1 player1 player1 的得分是 2 + 3 = 5 。
p l a y e r 2 player2 player2 的得分是 4 + 1 = 5 。
p l a y e r 1 player1 player1 的得分等于 p l a y e r 2 player2 player2 的得分,所以这一场比赛平局,答案为 0

提示:

  • n = = p l a y e r 1. l e n g t h = = p l a y e r 2. l e n g t h n == player1.length == player2.length n==player1.length==player2.length
  • 1 < = n < = 1000 1 <= n <= 1000 1<=n<=1000
  • 0 < = p l a y e r 1 [ i ] , p l a y e r 2 [ i ] < = 10 0 <= player1[i], player2[i] <= 10 0<=player1[i],player2[i]<=10

相关标签 :数组、模拟

题解

今天的问题难度简单,菜狗狂喜,轻松拿捏。

方法:模拟比赛过程

根据题意可以知道,第 i i i 轮中如果前两轮中存在任意一轮击中 10 10 10 个瓶子,则得分为 2 x i 2x_i 2xi ,否则得分为 x i x_i xi 。我们直接模拟即可,假设当前遍历到 第 i i i 轮,检测 i i i 的前两轮是否击中 10 10 10 个瓶子,主要检测数组的第 i − 1 i−1 i1, i − 2 i−2 i2 个元素中是否存在等于 10 10 10 的元素,如果存在则当前得分翻倍,否则不进行翻倍,累加每轮得分得到总得分别为 s 1 , s 2 s1,s2 s1,s2,比较二者的大小,根据题意返回即可。

实现代码(Python)
class Solution:
    def isWinner(self, player1: List[int], player2: List[int]) -> int:
        def calculate_score(player):
            score = 0
            for i in range(len(player)):
                if i > 1 and player[i-1] == 10 or (player[i-2] == 10 and player[i-1] != 10):
                    score += 2 * player[i]
                else:
                    score += player[i]
            return score

        score1 = calculate_score(player1)
        score2 = calculate_score(player2)

        if score1 > score2:
            return 1
        elif score1 < score2:
            return 2
        else:
            return 0
复杂度分析:
  • 时间复杂度:KaTeX parse error: Expected 'EOF', got '}' at position 4: O(n}̲),其中 n n n 表示给定数组的长度。模拟只需要遍历每个数组一遍即可求出每只球队的得分,需要的时间为 O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

题记:


  • 研究生在读,我会尽量保持LeetCode每日一题的思路和代码输出。希望大家多多支持。
  • 水平有限,希望各位大佬能够批评指正。您的教诲是我进步的船帆。
  • 希望各位跟我一样的小白能跟我一起参与到做题和讨论中来。共同进步是我所能期盼的最高愿想。
  • 您的点赞和关注是我坚持分享的动力泉源,希望能将这件简单平凡的事一直做下去。感谢大家。

你可能感兴趣的:(LeetCode每日一题,游戏,leetcode,linux)