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

给你一个整数数组 cards ,其中 cards[i] 表示第 i 张卡牌的 值 。如果两张卡牌的值相同,则认为这一对卡牌 匹配 。
返回你必须拿起的最小连续卡牌数,以使在拿起的卡牌中有一对匹配的卡牌。如果无法得到一对匹配的卡牌,返回 -1 。

  • 输入:cards = [3,4,2,3,4,7]
    输出:4
    解释:拿起卡牌 [3,4,2,3] 将会包含一对值为 3 的匹配卡牌。注意,拿起 [4,2,3,4] 也是最优方案。

  • 输入:cards = [1,0,5,3]
    输出:-1
    解释:无法找出含一对匹配卡牌的一组连续卡牌。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var minimumCardPickup = function(cards) {
const map = {};
for (let i = 0; i < cards.length; i++) {
const tmp = map[cards[i]] || [];
tmp.push(i);
map[cards[i]] = tmp;
}
let ans = Number.MAX_SAFE_INTEGER;
for (const arr of Object.values(map)) {
if (arr.length > 1) {
for (let i = 1; i < arr.length; i++) {
ans = Math.min(ans, arr[i] - arr[i - 1] + 1);
}
}
}
return ans === Number.MAX_SAFE_INTEGER ? -1 : ans;
};