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

Raphael Liu Lv10

给你一个整数数组 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 <= 105
  • 0 <= cards[i] <= 106

思路分析:
其实本题的意思就是在数组中找到两个数字相同且他们之间的距离最小值是多少,因为本题既要找到两个相等的数又要记录其出现的位置,因此这是一种映射关系就会想到用 map 容器的一对键值存储 数组元素的值和位置 ,即可解决本题。

具体实现步骤:

  • 定义 map 容器用于存储 《值,位置》;
  • map 存数值 cards[i] 出现的最近一次下标,如果已存就更新答案,然后更新 map 存的下标;
  • 返回结果 result == INT_MAX ? -1 : result;

具体代码如下:

[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int minimumCardPickup(vector<int>& cards) {
/* map存数值cards[i]出现的最近一次下标 */
unordered_map<int,int> map;
int result = INT_MAX;
for(int i = 0; i < cards.size(); i++){
if(map.count(cards[i]))
result = min(result,i - map[cards[i]] + 1);
map[cards[i]] = i;
}
return result == INT_MAX ? -1 : result;
}
};

复杂度分析:

  • 时间复杂度:O(n),n 是数组 cards 的长度;
  • 空间复杂度:O(n)。
 Comments
On this page
2260-必须拿起的最小连续卡牌数