@@ -63,6 +63,12 @@ nums 中的所有元素都可以被 p = 1 整除。
63
63
64
64
<!-- 这里可写通用的实现逻辑 -->
65
65
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
+
66
72
<!-- tabs:start -->
67
73
68
74
### ** Python3**
@@ -76,15 +82,28 @@ class Solution:
76
82
s = set ()
77
83
for i in range (n):
78
84
cnt = 0
79
- t = " "
80
85
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:
87
104
break
105
+ t += str (x) + " ,"
106
+ s.add(t)
88
107
return len (s)
89
108
```
90
109
@@ -95,15 +114,13 @@ class Solution:
95
114
``` java
96
115
class Solution {
97
116
public int countDistinct (int [] nums , int k , int p ) {
117
+ int n = nums. length;
98
118
Set<String > s = new HashSet<> ();
99
- for (int i = 0 , n = nums . length ; i < n; ++ i) {
119
+ for (int i = 0 ; i < n; ++ i) {
100
120
int cnt = 0 ;
101
121
String t = " " ;
102
122
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) {
107
124
break ;
108
125
}
109
126
t += nums[j] + " ," ;
@@ -122,12 +139,14 @@ class Solution {
122
139
public:
123
140
int countDistinct(vector<int >& nums, int k, int p) {
124
141
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) {
126
144
int cnt = 0;
127
- string t = "" ;
145
+ string t;
128
146
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
+ }
131
150
t += to_string(nums[ j] ) + ",";
132
151
s.insert(t);
133
152
}
@@ -141,19 +160,18 @@ public:
141
160
142
161
```go
143
162
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 {
150
168
cnt++
169
+ if cnt > k {
170
+ break
171
+ }
151
172
}
152
- if cnt > k {
153
- break
154
- }
155
- t += string(nums[j]) + ","
156
- s[t] = true
173
+ t += string(x) + ","
174
+ s[t] = struct{}{}
157
175
}
158
176
}
159
177
return len(s)
@@ -165,25 +183,19 @@ func countDistinct(nums []int, k int, p int) int {
165
183
``` ts
166
184
function countDistinct(nums : number [], k : number , p : number ): number {
167
185
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 );
184
196
}
185
197
}
186
- return ans .size ;
198
+ return s .size ;
187
199
}
188
200
```
189
201
0 commit comments