Skip to content

Commit f287f7f

Browse files
authoredDec 21, 2023
feat: add solutions to lc problem: No.1852 (#2138)
No.1852.Distinct Numbers in Each Subarray
1 parent 2cd7657 commit f287f7f

File tree

7 files changed

+428
-147
lines changed

7 files changed

+428
-147
lines changed
 

‎solution/1800-1899/1852.Distinct Numbers in Each Subarray/README.md

+162-37
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,17 @@
5050

5151
<!-- 这里可写通用的实现逻辑 -->
5252

53-
**方法一:滑动窗口 + 哈希表/数组**
53+
**方法一:滑动窗口 + 哈希表或数组**
5454

55-
用数组或哈希表记录每个窗口大小为 $k$ 的子数组中的数字出现的次数,然后遍历数组,每次更新哈希表,并记录当前窗口中数字的种类数
55+
我们用一个哈希表或数组 $cnt$ 用户记录每个长度为 $k$ 的子数组中数字的出现次数
5656

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$。
5864

5965
<!-- tabs:start -->
6066

@@ -65,16 +71,13 @@
6571
```python
6672
class Solution:
6773
def distinctNumbers(self, nums: List[int], k: int) -> List[int]:
68-
n = len(nums)
6974
cnt = Counter(nums[:k])
7075
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)):
7777
cnt[nums[i]] += 1
78+
cnt[nums[i - k]] -= 1
79+
if cnt[nums[i - k]] == 0:
80+
cnt.pop(nums[i - k])
7881
ans.append(len(cnt))
7982
return ans
8083
```
@@ -86,24 +89,50 @@ class Solution:
8689
```java
8790
class Solution {
8891
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;
91120
for (int i = 0; i < k; ++i) {
92-
if (cnt[nums[i]]++ == 0) {
93-
++x;
121+
if (++cnt[nums[i]] == 1) {
122+
++v;
94123
}
95124
}
96125
int n = nums.length;
97126
int[] ans = new int[n - k + 1];
98-
ans[0] = x;
127+
ans[0] = v;
99128
for (int i = k; i < n; ++i) {
100-
if (--cnt[nums[i - k]] == 0) {
101-
--x;
129+
if (++cnt[nums[i]] == 1) {
130+
++v;
102131
}
103-
if (cnt[nums[i]]++ == 0) {
104-
++x;
132+
if (--cnt[nums[i - k]] == 0) {
133+
--v;
105134
}
106-
ans[i - k + 1] = x;
135+
ans[i - k + 1] = v;
107136
}
108137
return ans;
109138
}
@@ -116,24 +145,49 @@ class Solution {
116145
class Solution {
117146
public:
118147
vector<int> distinctNumbers(vector<int>& nums, int k) {
119-
int cnt[100010] = {0};
120-
int x = 0;
148+
unordered_map<int, int> cnt;
121149
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]);
124159
}
160+
ans.push_back(cnt.size());
125161
}
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));
126174
int n = nums.size();
175+
int v = 0;
127176
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;
129183
for (int i = k; i < n; ++i) {
130-
if (--cnt[nums[i - k]] == 0) {
131-
--x;
184+
if (++cnt[nums[i]] == 1) {
185+
++v;
132186
}
133-
if (cnt[nums[i]]++ == 0) {
134-
++x;
187+
if (--cnt[nums[i - k]] == 0) {
188+
--v;
135189
}
136-
ans[i - k + 1] = x;
190+
ans[i - k + 1] = v;
137191
}
138192
return ans;
139193
}
@@ -145,23 +199,94 @@ public:
145199
```go
146200
func distinctNumbers(nums []int, k int) []int {
147201
cnt := map[int]int{}
148-
for _, v := range nums[:k] {
149-
cnt[v]++
202+
for _, x := range nums[:k] {
203+
cnt[x]++
150204
}
151205
ans := []int{len(cnt)}
152206
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-
}
158207
cnt[nums[i]]++
208+
cnt[nums[i-k]]--
209+
if cnt[nums[i-k]] == 0 {
210+
delete(cnt, nums[i-k])
211+
}
159212
ans = append(ans, len(cnt))
160213
}
161214
return ans
162215
}
163216
```
164217

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+
165290
### **...**
166291

167292
```

0 commit comments

Comments
 (0)
Please sign in to comment.