0822. 翻转卡片游戏
大约 3 分钟
---
0822. 翻转卡片游戏
- 标签:数组、哈希表
- 难度:中等
题目链接
题目大意
描述:
在桌子上有 张卡片,每张卡片的正面和背面都写着一个正数(正面与背面上的数有可能不一样)。
我们可以先翻转任意张卡片,然后选择其中一张卡片。
如果选中的那张卡片背面的数字 与任意一张卡片的正面的数字都不同,那么这个数字是我们想要的数字。
如果我们通过翻转卡片来交换正面与背面上的数,那么当初在正面的数就变成背面的数,背面的数就变成正面的数。
给定两个长度为 的数组 和 ,分别代表第 张卡片的正面和背面的数字。
要求:
计算出哪个数是这些想要的数字中最小的数(找到这些数中的最小值)。如果没有一个数字符合要求的,输出 。
说明:
- 。
- 。
- 。
示例:
- 示例 1:
输入:fronts = [1,2,4,4,7], backs = [1,3,4,1,3]
输出:2
解释:假设我们翻转第二张卡片,那么在正面的数变成了 [1,3,4,4,7] , 背面的数变成了 [1,2,4,1,3]。
接着我们选择第二张卡片,因为现在该卡片的背面的数是 2,2 与任意卡片上正面的数都不同,所以 2 就是我们想要的数字。- 示例 2:
输入:fronts = [1], backs = [1]
输出:0
解释:
无论如何翻转都无法得到想要的数字,所以返回 0 。解题思路
思路 1:哈希表
这道题的关键是理解:如果一张卡片的正面和背面数字相同,那么这个数字永远不可能成为答案(因为无论怎么翻转,这个数字都会出现在某张卡片的正面)。
算法步骤:
- 找出所有正反面数字相同的卡片,将这些数字加入「禁止集合」。
- 遍历所有卡片的正面和背面,找出不在禁止集合中的最小数字。
思路 1:代码
class Solution:
def flipgame(self, fronts: List[int], backs: List[int]) -> int:
n = len(fronts)
# 找出所有正反面相同的数字,这些数字不能作为答案
forbidden = set()
for i in range(n):
if fronts[i] == backs[i]:
forbidden.add(fronts[i])
# 找出所有可能的数字中的最小值
result = float('inf')
# 遍历所有正面和背面的数字
for num in fronts + backs:
if num not in forbidden:
result = min(result, num)
# 如果没有找到合适的数字,返回 0
return result if result != float('inf') else 0思路 1:复杂度分析
- 时间复杂度:,其中 是卡片的数量。需要遍历所有卡片两次。
- 空间复杂度:,需要使用哈希表存储禁止的数字。