保龄球游戏的获胜者(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 i?1, i ? 2 i?2 i?2 个元素中是否存在等于 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每日一题的思路和代码输出。希望大家多多支持。
- 水平有限,希望各位大佬能够批评指正。您的教诲是我进步的船帆。
- 希望各位跟我一样的小白能跟我一起参与到做题和讨论中来。共同进步是我所能期盼的最高愿想。
- 您的点赞和关注是我坚持分享的动力泉源,希望能将这件简单平凡的事一直做下去。感谢大家。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!