一、题目描述
题目链接
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
解释:无法找出含一对匹配卡牌的一组连续卡牌。
二、解题思路
题目可以使用滑动窗口,首先将窗口中元素加入哈希表中,窗口右侧右移,当满足题意时更新答案,窗口左侧右移
三、代码
class Solution {
public:
int minimumCardPickup(vector<int>& c) {
unordered_map<int, int> mp;
int ans = 1e9;
for(int i = 0, j = 0; j < c.size(); j++) {
mp[c[j]]++;
while(i < j && mp[c[j]] > 1) {
ans = min(ans, j - i + 1);
mp[c[i]]--;
i++;
}
}
if(ans == 1e9) return -1;
return ans;
}
};