Skip to content

Commit bf519ce

Browse files
committed
feat: add solutions to lc problem: No.2261
No.2261.K Divisible Elements Subarrays
1 parent 5cd6890 commit bf519ce

File tree

7 files changed

+141
-132
lines changed

7 files changed

+141
-132
lines changed

solution/2200-2299/2261.K Divisible Elements Subarrays/README.md

+56-44
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ nums 中的所有元素都可以被 p = 1 整除。
6363

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

66+
**方法一:哈希表 + 枚举**
67+
68+
我们可以枚举子数组的左右端点 $i$ 和 $j$,其中 $0 \leq i \leq j < n$。对于每个子数组 $nums[i,..j]$,我们可以统计其中可以被 $p$ 整除的元素的个数 $cnt$,如果 $cnt \leq k$,则该子数组满足条件。我们将所有满足条件的子数组的元素序列作为字符串存入哈希表中,最后哈希表中的元素个数即为答案。
69+
70+
时间复杂度 $O(n^3)$,空间复杂度 $O(n^2)$。其中 $n$ 为数组 $nums$ 的长度。
71+
6672
<!-- tabs:start -->
6773

6874
### **Python3**
@@ -76,15 +82,28 @@ class Solution:
7682
s = set()
7783
for i in range(n):
7884
cnt = 0
79-
t = ""
8085
for j in range(i, n):
81-
if nums[j] % p == 0:
82-
cnt += 1
83-
if cnt <= k:
84-
t += str(nums[j]) + ","
85-
s.add(t)
86-
else:
86+
cnt += nums[j] % p == 0
87+
if cnt > k:
88+
break
89+
s.add(tuple(nums[i: j + 1]))
90+
return len(s)
91+
```
92+
93+
```python
94+
class Solution:
95+
def countDistinct(self, nums: List[int], k: int, p: int) -> int:
96+
n = len(nums)
97+
s = set()
98+
for i in range(n):
99+
cnt = 0
100+
t = ""
101+
for x in nums[i:]:
102+
cnt += x % p == 0
103+
if cnt > k:
87104
break
105+
t += str(x) + ","
106+
s.add(t)
88107
return len(s)
89108
```
90109

@@ -95,15 +114,13 @@ class Solution:
95114
```java
96115
class Solution {
97116
public int countDistinct(int[] nums, int k, int p) {
117+
int n = nums.length;
98118
Set<String> s = new HashSet<>();
99-
for (int i = 0, n = nums.length; i < n; ++i) {
119+
for (int i = 0; i < n; ++i) {
100120
int cnt = 0;
101121
String t = "";
102122
for (int j = i; j < n; ++j) {
103-
if (nums[j] % p == 0) {
104-
++cnt;
105-
}
106-
if (cnt > k) {
123+
if (nums[j] % p == 0 && ++cnt > k) {
107124
break;
108125
}
109126
t += nums[j] + ",";
@@ -122,12 +139,14 @@ class Solution {
122139
public:
123140
int countDistinct(vector<int>& nums, int k, int p) {
124141
unordered_set<string> s;
125-
for (int i = 0, n = nums.size(); i < n; ++i) {
142+
int n = nums.size();
143+
for (int i = 0; i < n; ++i) {
126144
int cnt = 0;
127-
string t = "";
145+
string t;
128146
for (int j = i; j < n; ++j) {
129-
if (nums[j] % p == 0) ++cnt;
130-
if (cnt > k) break;
147+
if (nums[j] % p == 0 && ++cnt > k) {
148+
break;
149+
}
131150
t += to_string(nums[j]) + ",";
132151
s.insert(t);
133152
}
@@ -141,19 +160,18 @@ public:
141160
142161
```go
143162
func countDistinct(nums []int, k int, p int) int {
144-
s := map[string]bool{}
145-
for i, n := 0, len(nums); i < n; i++ {
146-
cnt := 0
147-
t := ""
148-
for j := i; j < n; j++ {
149-
if nums[j]%p == 0 {
163+
s := map[string]struct{}{}
164+
for i := range nums {
165+
cnt, t := 0, ""
166+
for _, x := range nums[i:] {
167+
if x%p == 0 {
150168
cnt++
169+
if cnt > k {
170+
break
171+
}
151172
}
152-
if cnt > k {
153-
break
154-
}
155-
t += string(nums[j]) + ","
156-
s[t] = true
173+
t += string(x) + ","
174+
s[t] = struct{}{}
157175
}
158176
}
159177
return len(s)
@@ -165,25 +183,19 @@ func countDistinct(nums []int, k int, p int) int {
165183
```ts
166184
function countDistinct(nums: number[], k: number, p: number): number {
167185
const n = nums.length;
168-
const numSet = new Set(nums);
169-
const verfiedSet = new Set<number>();
170-
for (let i of numSet) {
171-
if (i % p != 0) continue;
172-
verfiedSet.add(i);
173-
}
174-
let ans = new Set<string>();
175-
for (let i = 0; i < n; i++) {
176-
let sub = [];
177-
for (let j = i, cnt = 0; j < n; j++) {
178-
const num = nums[j];
179-
if (verfiedSet.has(num)) cnt++;
180-
if (cnt > k) break;
181-
sub.push(num);
182-
const str = sub.join(',');
183-
ans.add(str);
186+
const s = new Set();
187+
for (let i = 0; i < n; ++i) {
188+
let cnt = 0;
189+
let t = '';
190+
for (let j = i; j < n; ++j) {
191+
if (nums[j] % p === 0 && ++cnt > k) {
192+
break;
193+
}
194+
t += nums[j].toString() + ',';
195+
s.add(t);
184196
}
185197
}
186-
return ans.size;
198+
return s.size;
187199
}
188200
```
189201

solution/2200-2299/2261.K Divisible Elements Subarrays/README_EN.md

+50-44
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,28 @@ class Solution:
6767
s = set()
6868
for i in range(n):
6969
cnt = 0
70-
t = ""
7170
for j in range(i, n):
72-
if nums[j] % p == 0:
73-
cnt += 1
74-
if cnt <= k:
75-
t += str(nums[j]) + ","
76-
s.add(t)
77-
else:
71+
cnt += nums[j] % p == 0
72+
if cnt > k:
7873
break
74+
s.add(tuple(nums[i: j + 1]))
75+
return len(s)
76+
```
77+
78+
```python
79+
class Solution:
80+
def countDistinct(self, nums: List[int], k: int, p: int) -> int:
81+
n = len(nums)
82+
s = set()
83+
for i in range(n):
84+
cnt = 0
85+
t = ""
86+
for x in nums[i:]:
87+
cnt += x % p == 0
88+
if cnt > k:
89+
break
90+
t += str(x) + ","
91+
s.add(t)
7992
return len(s)
8093
```
8194

@@ -84,15 +97,13 @@ class Solution:
8497
```java
8598
class Solution {
8699
public int countDistinct(int[] nums, int k, int p) {
100+
int n = nums.length;
87101
Set<String> s = new HashSet<>();
88-
for (int i = 0, n = nums.length; i < n; ++i) {
102+
for (int i = 0; i < n; ++i) {
89103
int cnt = 0;
90104
String t = "";
91105
for (int j = i; j < n; ++j) {
92-
if (nums[j] % p == 0) {
93-
++cnt;
94-
}
95-
if (cnt > k) {
106+
if (nums[j] % p == 0 && ++cnt > k) {
96107
break;
97108
}
98109
t += nums[j] + ",";
@@ -111,12 +122,14 @@ class Solution {
111122
public:
112123
int countDistinct(vector<int>& nums, int k, int p) {
113124
unordered_set<string> s;
114-
for (int i = 0, n = nums.size(); i < n; ++i) {
125+
int n = nums.size();
126+
for (int i = 0; i < n; ++i) {
115127
int cnt = 0;
116-
string t = "";
128+
string t;
117129
for (int j = i; j < n; ++j) {
118-
if (nums[j] % p == 0) ++cnt;
119-
if (cnt > k) break;
130+
if (nums[j] % p == 0 && ++cnt > k) {
131+
break;
132+
}
120133
t += to_string(nums[j]) + ",";
121134
s.insert(t);
122135
}
@@ -130,19 +143,18 @@ public:
130143
131144
```go
132145
func countDistinct(nums []int, k int, p int) int {
133-
s := map[string]bool{}
134-
for i, n := 0, len(nums); i < n; i++ {
135-
cnt := 0
136-
t := ""
137-
for j := i; j < n; j++ {
138-
if nums[j]%p == 0 {
146+
s := map[string]struct{}{}
147+
for i := range nums {
148+
cnt, t := 0, ""
149+
for _, x := range nums[i:] {
150+
if x%p == 0 {
139151
cnt++
152+
if cnt > k {
153+
break
154+
}
140155
}
141-
if cnt > k {
142-
break
143-
}
144-
t += string(nums[j]) + ","
145-
s[t] = true
156+
t += string(x) + ","
157+
s[t] = struct{}{}
146158
}
147159
}
148160
return len(s)
@@ -154,25 +166,19 @@ func countDistinct(nums []int, k int, p int) int {
154166
```ts
155167
function countDistinct(nums: number[], k: number, p: number): number {
156168
const n = nums.length;
157-
const numSet = new Set(nums);
158-
const verfiedSet = new Set<number>();
159-
for (let i of numSet) {
160-
if (i % p != 0) continue;
161-
verfiedSet.add(i);
162-
}
163-
let ans = new Set<string>();
164-
for (let i = 0; i < n; i++) {
165-
let sub = [];
166-
for (let j = i, cnt = 0; j < n; j++) {
167-
const num = nums[j];
168-
if (verfiedSet.has(num)) cnt++;
169-
if (cnt > k) break;
170-
sub.push(num);
171-
const str = sub.join(',');
172-
ans.add(str);
169+
const s = new Set();
170+
for (let i = 0; i < n; ++i) {
171+
let cnt = 0;
172+
let t = '';
173+
for (let j = i; j < n; ++j) {
174+
if (nums[j] % p === 0 && ++cnt > k) {
175+
break;
176+
}
177+
t += nums[j].toString() + ',';
178+
s.add(t);
173179
}
174180
}
175-
return ans.size;
181+
return s.size;
176182
}
177183
```
178184

solution/2200-2299/2261.K Divisible Elements Subarrays/Solution.cpp

+6-4
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ class Solution {
22
public:
33
int countDistinct(vector<int>& nums, int k, int p) {
44
unordered_set<string> s;
5-
for (int i = 0, n = nums.size(); i < n; ++i) {
5+
int n = nums.size();
6+
for (int i = 0; i < n; ++i) {
67
int cnt = 0;
7-
string t = "";
8+
string t;
89
for (int j = i; j < n; ++j) {
9-
if (nums[j] % p == 0) ++cnt;
10-
if (cnt > k) break;
10+
if (nums[j] % p == 0 && ++cnt > k) {
11+
break;
12+
}
1113
t += to_string(nums[j]) + ",";
1214
s.insert(t);
1315
}

solution/2200-2299/2261.K Divisible Elements Subarrays/Solution.go

+10-11
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
func countDistinct(nums []int, k int, p int) int {
2-
s := map[string]bool{}
3-
for i, n := 0, len(nums); i < n; i++ {
4-
cnt := 0
5-
t := ""
6-
for j := i; j < n; j++ {
7-
if nums[j]%p == 0 {
2+
s := map[string]struct{}{}
3+
for i := range nums {
4+
cnt, t := 0, ""
5+
for _, x := range nums[i:] {
6+
if x%p == 0 {
87
cnt++
8+
if cnt > k {
9+
break
10+
}
911
}
10-
if cnt > k {
11-
break
12-
}
13-
t += string(nums[j]) + ","
14-
s[t] = true
12+
t += string(x) + ","
13+
s[t] = struct{}{}
1514
}
1615
}
1716
return len(s)

solution/2200-2299/2261.K Divisible Elements Subarrays/Solution.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
class Solution {
22
public int countDistinct(int[] nums, int k, int p) {
3+
int n = nums.length;
34
Set<String> s = new HashSet<>();
4-
for (int i = 0, n = nums.length; i < n; ++i) {
5+
for (int i = 0; i < n; ++i) {
56
int cnt = 0;
67
String t = "";
78
for (int j = i; j < n; ++j) {
8-
if (nums[j] % p == 0) {
9-
++cnt;
10-
}
11-
if (cnt > k) {
9+
if (nums[j] % p == 0 && ++cnt > k) {
1210
break;
1311
}
1412
t += nums[j] + ",";

solution/2200-2299/2261.K Divisible Elements Subarrays/Solution.py

+5-7
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,10 @@ def countDistinct(self, nums: List[int], k: int, p: int) -> int:
55
for i in range(n):
66
cnt = 0
77
t = ""
8-
for j in range(i, n):
9-
if nums[j] % p == 0:
10-
cnt += 1
11-
if cnt <= k:
12-
t += str(nums[j]) + ","
13-
s.add(t)
14-
else:
8+
for x in nums[i:]:
9+
cnt += x % p == 0
10+
if cnt > k:
1511
break
12+
t += str(x) + ","
13+
s.add(t)
1614
return len(s)

0 commit comments

Comments
 (0)