题目

给你一个整数数组 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-consecutive-cards-to-pick-up
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

使用哈希表统计每个数字出现的最后位置,再次遇到时就表示遇到了两个相等的数,使用两个数的下标差去更新答案。

代码

  1. class Solution {
  2. public int minimumCardPickup(int[] cards) {
  3. int n = cards.length;
  4. Map<Integer, Integer> map = new HashMap<>();
  5. int ans = n + 1;
  6. for (int i = 0; i < n; i++) {
  7. int c = cards[i];
  8. if (map.containsKey(c)) {
  9. ans = Math.min(ans, i - map.get(c) + 1);
  10. }
  11. map.put(c, i);
  12. }
  13. return ans == n + 1 ? -1 : ans;
  14. }
  15. }