必须拿起的最小连续卡牌数
给你一个整数数组 cards ,其中 cards[i] 表示第 i 张卡牌的 值 。如果两张卡牌的值相同,则认为这一对卡牌 匹配 。
返回你必须拿起的最小连续卡牌数,以使在拿起的卡牌中有一对匹配的卡牌。如果无法得到一对匹配的卡牌,返回 -1 。
示例 1:
输入: cards = [3,4,2,3,4,7]
输出: 4
解释: 拿起卡牌 [3,4,2,3] 将会包含一对值为 3 的匹配卡牌。注意,拿起 [4,2,3,4] 也是最优方案。
示例 2:
输入: cards = [1,0,5,3]
输出: -1
解释: 无法找出含一对匹配卡牌的一组连续卡牌。
提示:
1 <= cards.length <= 10^50 <= cards[i] <= 10^6
解析
记录下来每个数字出现的位置,如果所有数字都只出现一次,就无解,如果有的数字出现了不止一次,找到相邻最近的那组即可。
from collections import defaultdict
class Solution:
def minimumCardPickup(self, cards: List[int]) -> int:
d = defaultdict(list)
for i in range(len(cards)):
card = cards[i]
d[card].append(i) # 用一个数组记录该数字card出现的位置
res = len(cards)+10
for _, values in d.items():
if len(values) < 2:
continue
for i in range(len(values)-1):
delta = values[i+1] - values[i]
if delta < res:
res = delta
if res == len(cards)+10:
res = -2
return res + 1