题目描述
给你一个整数数组 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 <= cards.length <= 10^5
0 <= cards[i] <= 10^6
算法
(哈希表) $O(n)$
- 使用哈希表记录当前数字上一次出现的位置。
- 从头开始遍历数组。如果当前数字出现过,则更新这一对数字匹配产生的答案,然后更新当前数字出现的位置。
时间复杂度
- 每个位置操作哈希表一次,故时间复杂度为 $O(n)$。
空间复杂度
- 需要 $O(n)$ 的额外空间存储哈希表。
C++ 代码
class Solution {
public:
int minimumCardPickup(vector<int>& cards) {
const int n = cards.size();
unordered_map<int, int> seen;
int ans = INT_MAX;
for (int i = 0; i < n; i++) {
if (seen.find(cards[i]) != seen.end())
ans = min(ans, i - seen[cards[i]] + 1);
seen[cards[i]] = i;
}
if (ans == INT_MAX)
return -1;
return ans;
}
};