日渐头秃的代码日记 -- 第291场周赛第2题

151 阅读1分钟

必须拿起的最小连续卡牌数

给你一个整数数组 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^5
  • 0 <= 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