Skip to content

Commit

Permalink
feat: add solutions to lc problem: No.1852
Browse files Browse the repository at this point in the history
No.1852.Distinct Numbers in Each Subarray
  • Loading branch information
yanglbme committed Sep 7, 2022
1 parent 5933a84 commit a71e487
Show file tree
Hide file tree
Showing 6 changed files with 264 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,22 +50,116 @@

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

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

用数组或哈希表记录每个窗口大小为 $k$ 的子数组中的数字出现的次数,然后遍历数组,每次更新哈希表,并记录当前窗口中数字的种类数。

时间复杂度 $O(n)$,空间复杂度 $O(n)$,其中 $n$ 是数组的长度。

<!-- tabs:start -->

### **Python3**

<!-- 这里可写当前语言的特殊实现逻辑 -->

```python

class Solution:
def distinctNumbers(self, nums: List[int], k: int) -> List[int]:
n = len(nums)
cnt = Counter(nums[:k])
ans = [len(cnt)]
for i in range(k, n):
u = nums[i - k]
cnt[u] -= 1
if cnt[u] == 0:
cnt.pop(u)

cnt[nums[i]] += 1
ans.append(len(cnt))
return ans
```

### **Java**

<!-- 这里可写当前语言的特殊实现逻辑 -->

```java
class Solution {
public int[] distinctNumbers(int[] nums, int k) {
int[] cnt = new int[100010];
int x = 0;
for (int i = 0; i < k; ++i) {
if (cnt[nums[i]]++ == 0) {
++x;
}
}
int n = nums.length;
int[] ans = new int[n - k + 1];
ans[0] = x;
for (int i = k; i < n; ++i) {
if (--cnt[nums[i - k]] == 0) {
--x;
}
if (cnt[nums[i]]++ == 0) {
++x;
}
ans[i - k + 1] = x;
}
return ans;
}
}
```

### **C++**

```cpp
class Solution {
public:
vector<int> distinctNumbers(vector<int>& nums, int k) {
int cnt[100010] = {0};
int x = 0;
for (int i = 0; i < k; ++i) {
if (cnt[nums[i]]++ == 0) {
++x;
}
}
int n = nums.size();
vector<int> ans(n - k + 1);
ans[0] = x;
for (int i = k; i < n; ++i) {
if (--cnt[nums[i - k]] == 0) {
--x;
}
if (cnt[nums[i]]++ == 0) {
++x;
}
ans[i - k + 1] = x;
}
return ans;
}
};
```
### **Go**
```go
func distinctNumbers(nums []int, k int) []int {
cnt := map[int]int{}
for _, v := range nums[:k] {
cnt[v]++
}
ans := []int{len(cnt)}
for i := k; i < len(nums); i++ {
u := nums[i-k]
cnt[u]--
if cnt[u] == 0 {
delete(cnt, u)
}
cnt[nums[i]]++
ans = append(ans, len(cnt))
}
return ans
}
```

### **...**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,8 @@
<p><strong>Constraints:</strong></p>

<ul>

<li><code>1 &lt;= k &lt;= nums.length &lt;= 10<sup>5</sup></code></li>

<li><code>1 &lt;= nums[i] &lt;= 10<sup>5</sup></code></li>

</ul>

## Solutions
Expand All @@ -71,13 +68,101 @@
### **Python3**

```python

class Solution:
def distinctNumbers(self, nums: List[int], k: int) -> List[int]:
n = len(nums)
cnt = Counter(nums[:k])
ans = [len(cnt)]
for i in range(k, n):
u = nums[i - k]
cnt[u] -= 1
if cnt[u] == 0:
cnt.pop(u)

cnt[nums[i]] += 1
ans.append(len(cnt))
return ans
```

### **Java**

```java
class Solution {
public int[] distinctNumbers(int[] nums, int k) {
int[] cnt = new int[100010];
int x = 0;
for (int i = 0; i < k; ++i) {
if (cnt[nums[i]]++ == 0) {
++x;
}
}
int n = nums.length;
int[] ans = new int[n - k + 1];
ans[0] = x;
for (int i = k; i < n; ++i) {
if (--cnt[nums[i - k]] == 0) {
--x;
}
if (cnt[nums[i]]++ == 0) {
++x;
}
ans[i - k + 1] = x;
}
return ans;
}
}
```

### **C++**

```cpp
class Solution {
public:
vector<int> distinctNumbers(vector<int>& nums, int k) {
int cnt[100010] = {0};
int x = 0;
for (int i = 0; i < k; ++i) {
if (cnt[nums[i]]++ == 0) {
++x;
}
}
int n = nums.size();
vector<int> ans(n - k + 1);
ans[0] = x;
for (int i = k; i < n; ++i) {
if (--cnt[nums[i - k]] == 0) {
--x;
}
if (cnt[nums[i]]++ == 0) {
++x;
}
ans[i - k + 1] = x;
}
return ans;
}
};
```
### **Go**
```go
func distinctNumbers(nums []int, k int) []int {
cnt := map[int]int{}
for _, v := range nums[:k] {
cnt[v]++
}
ans := []int{len(cnt)}
for i := k; i < len(nums); i++ {
u := nums[i-k]
cnt[u]--
if cnt[u] == 0 {
delete(cnt, u)
}
cnt[nums[i]]++
ans = append(ans, len(cnt))
}
return ans
}
```

### **...**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
class Solution {
public:
vector<int> distinctNumbers(vector<int>& nums, int k) {
int cnt[100010] = {0};
int x = 0;
for (int i = 0; i < k; ++i) {
if (cnt[nums[i]]++ == 0) {
++x;
}
}
int n = nums.size();
vector<int> ans(n - k + 1);
ans[0] = x;
for (int i = k; i < n; ++i) {
if (--cnt[nums[i - k]] == 0) {
--x;
}
if (cnt[nums[i]]++ == 0) {
++x;
}
ans[i - k + 1] = x;
}
return ans;
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
func distinctNumbers(nums []int, k int) []int {
cnt := map[int]int{}
for _, v := range nums[:k] {
cnt[v]++
}
ans := []int{len(cnt)}
for i := k; i < len(nums); i++ {
u := nums[i-k]
cnt[u]--
if cnt[u] == 0 {
delete(cnt, u)
}
cnt[nums[i]]++
ans = append(ans, len(cnt))
}
return ans
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
class Solution {
public int[] distinctNumbers(int[] nums, int k) {
int[] cnt = new int[100010];
int x = 0;
for (int i = 0; i < k; ++i) {
if (cnt[nums[i]]++ == 0) {
++x;
}
}
int n = nums.length;
int[] ans = new int[n - k + 1];
ans[0] = x;
for (int i = k; i < n; ++i) {
if (--cnt[nums[i - k]] == 0) {
--x;
}
if (cnt[nums[i]]++ == 0) {
++x;
}
ans[i - k + 1] = x;
}
return ans;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class Solution:
def distinctNumbers(self, nums: List[int], k: int) -> List[int]:
n = len(nums)
cnt = Counter(nums[:k])
ans = [len(cnt)]
for i in range(k, n):
u = nums[i - k]
cnt[u] -= 1
if cnt[u] == 0:
cnt.pop(u)

cnt[nums[i]] += 1
ans.append(len(cnt))
return ans

0 comments on commit a71e487

Please sign in to comment.