37
37
38
38
<!-- 这里可写通用的实现逻辑 -->
39
39
40
+ ** 方法一:哈希表**
41
+
42
+ 我们初始化答案为 $+\infty$,遍历数组,对于每个数字 $x$,如果 $last[ x] $ 存在,则表示 $x$ 有一对匹配卡牌,此时更新答案为 $ans = min(ans, i - last[ x] + 1)$,最后如果答案为 $+\infty$,则返回 $-1$,否则返回答案。
43
+
44
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组长度。
45
+
40
46
<!-- tabs:start -->
41
47
42
48
### ** Python3**
46
52
``` python
47
53
class Solution :
48
54
def minimumCardPickup (self , cards : List[int ]) -> int :
49
- m = {}
50
- ans = 10 ** 6
51
- for i, c in enumerate (cards):
52
- if c in m :
53
- ans = min (ans, i - m[c ] + 1 )
54
- m[c ] = i
55
- return - 1 if ans == 10 ** 6 else ans
55
+ last = {}
56
+ ans = inf
57
+ for i, x in enumerate (cards):
58
+ if x in last :
59
+ ans = min (ans, i - last[x ] + 1 )
60
+ last[x ] = i
61
+ return - 1 if ans == inf else ans
56
62
```
57
63
58
64
### ** Java**
@@ -62,16 +68,16 @@ class Solution:
62
68
``` java
63
69
class Solution {
64
70
public int minimumCardPickup (int [] cards ) {
65
- Map<Integer , Integer > m = new HashMap<> ();
66
- int ans = 1000000 ;
67
- for ( int i = 0 ; i < cards . length; ++ i) {
68
- int c = cards[i];
69
- if (m . containsKey(c )) {
70
- ans = Math . min(ans, i - m . get(c ) + 1 );
71
+ Map<Integer , Integer > last = new HashMap<> ();
72
+ int n = cards . length ;
73
+ int ans = n + 1 ;
74
+ for ( int i = 0 ; i < n; ++ i) {
75
+ if (last . containsKey(cards[i] )) {
76
+ ans = Math . min(ans, i - last . get(cards[i] ) + 1 );
71
77
}
72
- m . put(c , i);
78
+ last . put(cards[i] , i);
73
79
}
74
- return ans == 1000000 ? - 1 : ans;
80
+ return ans > n ? - 1 : ans;
75
81
}
76
82
}
77
83
```
@@ -82,14 +88,16 @@ class Solution {
82
88
class Solution {
83
89
public:
84
90
int minimumCardPickup(vector<int >& cards) {
85
- unordered_map<int, int> m;
86
- int ans = 1e6;
87
- for (int i = 0; i < cards.size(); ++i) {
88
- int c = cards[ i] ;
89
- if (m.count(c)) ans = min(ans, i - m[ c] + 1);
90
- m[ c] = i;
91
+ unordered_map<int, int> last;
92
+ int n = cards.size();
93
+ int ans = n + 1;
94
+ for (int i = 0; i < n; ++i) {
95
+ if (last.count(cards[ i] )) {
96
+ ans = min(ans, i - last[ cards[ i]] + 1);
97
+ }
98
+ last[ cards[ i]] = i;
91
99
}
92
- return ans == 1e6 ? -1 : ans;
100
+ return ans > n ? -1 : ans;
93
101
}
94
102
};
95
103
```
@@ -98,44 +106,36 @@ public:
98
106
99
107
```go
100
108
func minimumCardPickup(cards []int) int {
101
- m := map[int]int{}
102
- ans := 1000000
103
- for i, c := range cards {
104
- if j, ok := m[c]; ok {
105
- ans = min(ans, i-j+1)
109
+ last := map[int]int{}
110
+ n := len(cards)
111
+ ans := n + 1
112
+ for i, x := range cards {
113
+ if j, ok := last[x]; ok && ans > i-j+1 {
114
+ ans = i - j + 1
106
115
}
107
- m[c ] = i
116
+ last[x ] = i
108
117
}
109
- if ans == 1000000 {
118
+ if ans > n {
110
119
return -1
111
120
}
112
121
return ans
113
122
}
114
-
115
- func min(a, b int) int {
116
- if a < b {
117
- return a
118
- }
119
- return b
120
- }
121
123
```
122
124
123
125
### ** TypeScript**
124
126
125
127
``` ts
126
128
function minimumCardPickup(cards : number []): number {
127
129
const n = cards .length ;
128
- let hashMap = new Map <number , number >();
129
- const max = Number .MAX_SAFE_INTEGER;
130
- let ans = max ;
131
- for (let i = 0 ; i < n ; i ++ ) {
132
- let num = cards [i ];
133
- if (hashMap .has (num )) {
134
- ans = Math .min (i - hashMap .get (num ) + 1 , ans );
130
+ const last = new Map <number , number >();
131
+ let ans = n + 1 ;
132
+ for (let i = 0 ; i < n ; ++ i ) {
133
+ if (last .has (cards [i ])) {
134
+ ans = Math .min (ans , i - last .get (cards [i ]) + 1 );
135
135
}
136
- hashMap .set (num , i );
136
+ last .set (cards [ i ] , i );
137
137
}
138
- return ans == max ? - 1 : ans ;
138
+ return ans > n ? - 1 : ans ;
139
139
}
140
140
```
141
141
0 commit comments