50
50
51
51
<!-- 这里可写通用的实现逻辑 -->
52
52
53
- ** 方法一:滑动窗口 + 哈希表/数组 **
53
+ ** 方法一:滑动窗口 + 哈希表或数组 **
54
54
55
- 用数组或哈希表记录每个窗口大小为 $ k$ 的子数组中的数字出现的次数,然后遍历数组,每次更新哈希表,并记录当前窗口中数字的种类数 。
55
+ 我们用一个哈希表或数组 $cnt$ 用户记录每个长度为 $ k$ 的子数组中数字的出现次数 。
56
56
57
- 时间复杂度 $O(n)$,空间复杂度 $O(n)$,其中 $n$ 是数组的长度。
57
+ 接下来,我们首先遍历数组前 $k$ 个元素,记录每个元素出现的次数,并且更新数字种类数 $v$,遍历后,我们首先将 $v$ 加入答案数组。
58
+
59
+ 然后,我们从下标 $k$ 继续遍历数组,每次遍历时,我们将当前元素的出现次数加一,并且将当前元素左边的元素的出现次数减一,如果减一后的出现次数为 $0$,则将其从哈希表或数组中删除,然后更新数字种类数 $v$,将其加入答案数组。
60
+
61
+ 遍历结束后,我们返回答案数组。
62
+
63
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$ 或 $O(M)$。其中 $n$ 是数组 $nums$ 的长度;而 $M$ 是数组 $nums$ 中的最大值,本题中 $M \le 10^5$。
58
64
59
65
<!-- tabs:start -->
60
66
65
71
``` python
66
72
class Solution :
67
73
def distinctNumbers (self , nums : List[int ], k : int ) -> List[int ]:
68
- n = len (nums)
69
74
cnt = Counter(nums[:k])
70
75
ans = [len (cnt)]
71
- for i in range (k, n):
72
- u = nums[i - k]
73
- cnt[u] -= 1
74
- if cnt[u] == 0 :
75
- cnt.pop(u)
76
-
76
+ for i in range (k, len (nums)):
77
77
cnt[nums[i]] += 1
78
+ cnt[nums[i - k]] -= 1
79
+ if cnt[nums[i - k]] == 0 :
80
+ cnt.pop(nums[i - k])
78
81
ans.append(len (cnt))
79
82
return ans
80
83
```
@@ -86,24 +89,50 @@ class Solution:
86
89
``` java
87
90
class Solution {
88
91
public int [] distinctNumbers (int [] nums , int k ) {
89
- int [] cnt = new int [100010 ];
90
- int x = 0 ;
92
+ Map<Integer , Integer > cnt = new HashMap<> ();
93
+ for (int i = 0 ; i < k; ++ i) {
94
+ cnt. merge(nums[i], 1 , Integer :: sum);
95
+ }
96
+ int n = nums. length;
97
+ int [] ans = new int [n - k + 1 ];
98
+ ans[0 ] = cnt. size();
99
+ for (int i = k; i < n; ++ i) {
100
+ cnt. merge(nums[i], 1 , Integer :: sum);
101
+ if (cnt. merge(nums[i - k], - 1 , Integer :: sum) == 0 ) {
102
+ cnt. remove(nums[i - k]);
103
+ }
104
+ ans[i - k + 1 ] = cnt. size();
105
+ }
106
+ return ans;
107
+ }
108
+ }
109
+ ```
110
+
111
+ ``` java
112
+ class Solution {
113
+ public int [] distinctNumbers (int [] nums , int k ) {
114
+ int m = 0 ;
115
+ for (int x : nums) {
116
+ m = Math . max(m, x);
117
+ }
118
+ int [] cnt = new int [m + 1 ];
119
+ int v = 0 ;
91
120
for (int i = 0 ; i < k; ++ i) {
92
- if (cnt[nums[i]]++ == 0 ) {
93
- ++ x ;
121
+ if (++ cnt[nums[i]] == 1 ) {
122
+ ++ v ;
94
123
}
95
124
}
96
125
int n = nums. length;
97
126
int [] ans = new int [n - k + 1 ];
98
- ans[0 ] = x ;
127
+ ans[0 ] = v ;
99
128
for (int i = k; i < n; ++ i) {
100
- if (-- cnt[nums[i - k ]] == 0 ) {
101
- -- x ;
129
+ if (++ cnt[nums[i]] == 1 ) {
130
+ ++ v ;
102
131
}
103
- if (cnt[nums[i]] ++ == 0 ) {
104
- ++ x ;
132
+ if (-- cnt[nums[i - k]] == 0 ) {
133
+ -- v ;
105
134
}
106
- ans[i - k + 1 ] = x ;
135
+ ans[i - k + 1 ] = v ;
107
136
}
108
137
return ans;
109
138
}
@@ -116,24 +145,49 @@ class Solution {
116
145
class Solution {
117
146
public:
118
147
vector<int > distinctNumbers(vector<int >& nums, int k) {
119
- int cnt[ 100010] = {0};
120
- int x = 0;
148
+ unordered_map<int, int> cnt;
121
149
for (int i = 0; i < k; ++i) {
122
- if (cnt[ nums[ i]] ++ == 0) {
123
- ++x;
150
+ ++cnt[ nums[ i]] ;
151
+ }
152
+ int n = nums.size();
153
+ vector<int > ans;
154
+ ans.push_back(cnt.size());
155
+ for (int i = k; i < n; ++i) {
156
+ ++cnt[ nums[ i]] ;
157
+ if (--cnt[ nums[ i - k]] == 0) {
158
+ cnt.erase(nums[ i - k] );
124
159
}
160
+ ans.push_back(cnt.size());
125
161
}
162
+ return ans;
163
+ }
164
+ };
165
+ ```
166
+
167
+ ```cpp
168
+ class Solution {
169
+ public:
170
+ vector<int> distinctNumbers(vector<int>& nums, int k) {
171
+ int m = *max_element(begin(nums), end(nums));
172
+ int cnt[m + 1];
173
+ memset(cnt, 0, sizeof(cnt));
126
174
int n = nums.size();
175
+ int v = 0;
127
176
vector<int> ans(n - k + 1);
128
- ans[ 0] = x;
177
+ for (int i = 0; i < k; ++i) {
178
+ if (++cnt[nums[i]] == 1) {
179
+ ++v;
180
+ }
181
+ }
182
+ ans[0] = v;
129
183
for (int i = k; i < n; ++i) {
130
- if (-- cnt[ nums[ i - k ]] == 0 ) {
131
- --x ;
184
+ if (++ cnt[nums[i]] == 1 ) {
185
+ ++v ;
132
186
}
133
- if (cnt[ nums[ i]] ++ == 0) {
134
- ++x ;
187
+ if (-- cnt[nums[i - k]] == 0) {
188
+ --v ;
135
189
}
136
- ans[ i - k + 1] = x ;
190
+ ans[i - k + 1] = v ;
137
191
}
138
192
return ans;
139
193
}
@@ -145,23 +199,94 @@ public:
145
199
``` go
146
200
func distinctNumbers (nums []int , k int ) []int {
147
201
cnt := map [int ]int {}
148
- for _, v := range nums[:k] {
149
- cnt[v ]++
202
+ for _ , x := range nums[:k] {
203
+ cnt[x ]++
150
204
}
151
205
ans := []int {len (cnt)}
152
206
for i := k; i < len (nums); i++ {
153
- u := nums[i-k]
154
- cnt[u]--
155
- if cnt[u] == 0 {
156
- delete(cnt, u)
157
- }
158
207
cnt[nums[i]]++
208
+ cnt[nums[i-k]]--
209
+ if cnt[nums[i-k]] == 0 {
210
+ delete (cnt, nums[i-k])
211
+ }
159
212
ans = append (ans, len (cnt))
160
213
}
161
214
return ans
162
215
}
163
216
```
164
217
218
+ ``` go
219
+ func distinctNumbers (nums []int , k int ) (ans []int ) {
220
+ m := slices.Max (nums)
221
+ cnt := make ([]int , m+1 )
222
+ v := 0
223
+ for _ , x := range nums[:k] {
224
+ cnt[x]++
225
+ if cnt[x] == 1 {
226
+ v++
227
+ }
228
+ }
229
+ ans = append (ans, v)
230
+ for i := k; i < len (nums); i++ {
231
+ cnt[nums[i]]++
232
+ if cnt[nums[i]] == 1 {
233
+ v++
234
+ }
235
+ cnt[nums[i-k]]--
236
+ if cnt[nums[i-k]] == 0 {
237
+ v--
238
+ }
239
+ ans = append (ans, v)
240
+ }
241
+ return
242
+ }
243
+ ```
244
+
245
+ ### ** TypeScript**
246
+
247
+ ``` ts
248
+ function distinctNumbers(nums : number [], k : number ): number [] {
249
+ const cnt: Map <number , number > = new Map ();
250
+ for (let i = 0 ; i < k ; ++ i ) {
251
+ cnt .set (nums [i ], (cnt .get (nums [i ]) ?? 0 ) + 1 );
252
+ }
253
+ const ans: number [] = [cnt .size ];
254
+ for (let i = k ; i < nums .length ; ++ i ) {
255
+ cnt .set (nums [i ], (cnt .get (nums [i ]) ?? 0 ) + 1 );
256
+ cnt .set (nums [i - k ], cnt .get (nums [i - k ])! - 1 );
257
+ if (cnt .get (nums [i - k ]) === 0 ) {
258
+ cnt .delete (nums [i - k ]);
259
+ }
260
+ ans .push (cnt .size );
261
+ }
262
+ return ans ;
263
+ }
264
+ ```
265
+
266
+ ``` ts
267
+ function distinctNumbers(nums : number [], k : number ): number [] {
268
+ const m = Math .max (... nums );
269
+ const cnt: number [] = Array (m + 1 ).fill (0 );
270
+ let v: number = 0 ;
271
+ for (let i = 0 ; i < k ; ++ i ) {
272
+ if (++ cnt [nums [i ]] === 1 ) {
273
+ v ++ ;
274
+ }
275
+ }
276
+ const ans: number [] = [v ];
277
+ for (let i = k ; i < nums .length ; ++ i ) {
278
+ if (++ cnt [nums [i ]] === 1 ) {
279
+ v ++ ;
280
+ }
281
+ if (-- cnt [nums [i - k ]] === 0 ) {
282
+ v -- ;
283
+ }
284
+ ans .push (v );
285
+ }
286
+ return ans ;
287
+ }
288
+ ```
289
+
165
290
### ** ...**
166
291
167
292
```
0 commit comments