@@ -77,11 +77,11 @@ tags:
77
77
78
78
### 方法一:前缀和 + 二分查找
79
79
80
- 我们先计算出数组 $nums$ 的前缀和数组 $s$,其中 $s[ i] $ 表示数组 $nums$ 前 $i$ 个元素的和。
80
+ 我们先计算出数组 $\textit{ nums} $ 的前缀和数组 $s$,其中 $s[ i] $ 表示数组 $\textit{ nums} $ 前 $i$ 个元素的和。
81
81
82
- 接下来,我们枚举数组 $nums$ 每个元素作为子数组的最后一个元素,对于每个元素,我们可以通过二分查找的方式找到最大的长度 $l$,使得 $s[ i] - s[ i - l] \times l < k$。那么以该元素为最后一个元素的子数组个数即为 $l$,我们将所有的 $l$ 相加即为答案。
82
+ 接下来,我们枚举数组 $\textit{ nums} $ 每个元素作为子数组的最后一个元素,对于每个元素,我们可以通过二分查找的方式找到最大的长度 $l$,使得 $s[ i] - s[ i - l] \times l < k$。那么以该元素为最后一个元素的子数组个数即为 $l$,我们将所有的 $l$ 相加即为答案。
83
83
84
- 时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $nums$ 的长度。
84
+ 时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $\textit{ nums} $ 的长度。
85
85
86
86
<!-- tabs:start -->
87
87
@@ -93,14 +93,14 @@ class Solution:
93
93
s = list (accumulate(nums, initial = 0 ))
94
94
ans = 0
95
95
for i in range (1 , len (s)):
96
- left, right = 0 , i
97
- while left < right :
98
- mid = (left + right + 1 ) >> 1
96
+ l, r = 0 , i
97
+ while l < r :
98
+ mid = (l + r + 1 ) >> 1
99
99
if (s[i] - s[i - mid]) * mid < k:
100
- left = mid
100
+ l = mid
101
101
else :
102
- right = mid - 1
103
- ans += left
102
+ r = mid - 1
103
+ ans += l
104
104
return ans
105
105
```
106
106
@@ -116,16 +116,16 @@ class Solution {
116
116
}
117
117
long ans = 0 ;
118
118
for (int i = 1 ; i <= n; ++ i) {
119
- int left = 0 , right = i;
120
- while (left < right ) {
121
- int mid = (left + right + 1 ) >> 1 ;
119
+ int l = 0 , r = i;
120
+ while (l < r ) {
121
+ int mid = (l + r + 1 ) >> 1 ;
122
122
if ((s[i] - s[i - mid]) * mid < k) {
123
- left = mid;
123
+ l = mid;
124
124
} else {
125
- right = mid - 1 ;
125
+ r = mid - 1 ;
126
126
}
127
127
}
128
- ans += left ;
128
+ ans += l ;
129
129
}
130
130
return ans;
131
131
}
@@ -146,16 +146,16 @@ public:
146
146
}
147
147
long long ans = 0;
148
148
for (int i = 1; i <= n; ++i) {
149
- int left = 0, right = i;
150
- while (left < right ) {
151
- int mid = (left + right + 1) >> 1;
149
+ int l = 0, r = i;
150
+ while (l < r ) {
151
+ int mid = (l + r + 1) >> 1;
152
152
if ((s[ i] - s[ i - mid] ) * mid < k) {
153
- left = mid;
153
+ l = mid;
154
154
} else {
155
- right = mid - 1;
155
+ r = mid - 1;
156
156
}
157
157
}
158
- ans += left ;
158
+ ans += l ;
159
159
}
160
160
return ans;
161
161
}
@@ -168,25 +168,81 @@ public:
168
168
func countSubarrays(nums []int, k int64) (ans int64) {
169
169
n := len(nums)
170
170
s := make([]int64, n+1)
171
- for i, v := range nums {
172
- s[i+1] = s[i] + int64(v )
171
+ for i, x := range nums {
172
+ s[i+1] = s[i] + int64(x )
173
173
}
174
174
for i := 1; i <= n; i++ {
175
- left, right := 0, i
176
- for left < right {
177
- mid := (left + right + 1) >> 1
175
+ l, r := 0, i
176
+ for l < r {
177
+ mid := (l + r + 1) >> 1
178
178
if (s[i]-s[i-mid])*int64(mid) < k {
179
- left = mid
179
+ l = mid
180
180
} else {
181
- right = mid - 1
181
+ r = mid - 1
182
182
}
183
183
}
184
- ans += int64(left )
184
+ ans += int64(l )
185
185
}
186
186
return
187
187
}
188
188
```
189
189
190
+ #### TypeScript
191
+
192
+ ``` ts
193
+ function countSubarrays(nums : number [], k : number ): number {
194
+ const n = nums .length ;
195
+ const s: number [] = Array (n + 1 ).fill (0 );
196
+ for (let i = 0 ; i < n ; ++ i ) {
197
+ s [i + 1 ] = s [i ] + nums [i ];
198
+ }
199
+ let ans = 0 ;
200
+ for (let i = 1 ; i <= n ; ++ i ) {
201
+ let [l, r] = [0 , i ];
202
+ while (l < r ) {
203
+ const mid = (l + r + 1 ) >> 1 ;
204
+ if ((s [i ] - s [i - mid ]) * mid < k ) {
205
+ l = mid ;
206
+ } else {
207
+ r = mid - 1 ;
208
+ }
209
+ }
210
+ ans += l ;
211
+ }
212
+ return ans ;
213
+ }
214
+ ```
215
+
216
+ #### Rust
217
+
218
+ ``` rust
219
+ impl Solution {
220
+ pub fn count_subarrays (nums : Vec <i32 >, k : i64 ) -> i64 {
221
+ let n = nums . len ();
222
+ let mut s = vec! [0i64 ; n + 1 ];
223
+ for i in 0 .. n {
224
+ s [i + 1 ] = s [i ] + nums [i ] as i64 ;
225
+ }
226
+ let mut ans = 0i64 ;
227
+ for i in 1 ..= n {
228
+ let mut l = 0 ;
229
+ let mut r = i ;
230
+ while l < r {
231
+ let mid = (l + r + 1 ) / 2 ;
232
+ let sum = s [i ] - s [i - mid ];
233
+ if sum * (mid as i64 ) < k {
234
+ l = mid ;
235
+ } else {
236
+ r = mid - 1 ;
237
+ }
238
+ }
239
+ ans += l as i64 ;
240
+ }
241
+ ans
242
+ }
243
+ }
244
+ ```
245
+
190
246
<!-- tabs: end -->
191
247
192
248
<!-- solution: end -->
@@ -197,7 +253,7 @@ func countSubarrays(nums []int, k int64) (ans int64) {
197
253
198
254
我们可以使用双指针的方式,维护一个滑动窗口,使得窗口内的元素和小于 $k$。那么以当前元素为最后一个元素的子数组个数即为窗口的长度,我们将所有的窗口长度相加即为答案。
199
255
200
- 时间复杂度 $O(n)$,其中 $n$ 为数组 $nums$ 的长度。空间复杂度 $O(1)$。
256
+ 时间复杂度 $O(n)$,其中 $n$ 为数组 $\textit{ nums} $ 的长度。空间复杂度 $O(1)$。
201
257
202
258
<!-- tabs: start -->
203
259
@@ -207,8 +263,8 @@ func countSubarrays(nums []int, k int64) (ans int64) {
207
263
class Solution :
208
264
def countSubarrays (self , nums : List[int ], k : int ) -> int :
209
265
ans = s = j = 0
210
- for i, v in enumerate (nums):
211
- s += v
266
+ for i, x in enumerate (nums):
267
+ s += x
212
268
while s * (i - j + 1 ) >= k:
213
269
s -= nums[j]
214
270
j += 1
@@ -258,8 +314,8 @@ public:
258
314
```go
259
315
func countSubarrays(nums []int, k int64) (ans int64) {
260
316
s, j := 0, 0
261
- for i, v := range nums {
262
- s += v
317
+ for i, x := range nums {
318
+ s += x
263
319
for int64(s*(i-j+1)) >= k {
264
320
s -= nums[j]
265
321
j++
@@ -270,6 +326,45 @@ func countSubarrays(nums []int, k int64) (ans int64) {
270
326
}
271
327
```
272
328
329
+ #### TypeScript
330
+
331
+ ``` ts
332
+ function countSubarrays(nums : number [], k : number ): number {
333
+ let [ans, s, j] = [0 , 0 , 0 ];
334
+ for (let i = 0 ; i < nums .length ; ++ i ) {
335
+ s += nums [i ];
336
+ while (s * (i - j + 1 ) >= k ) {
337
+ s -= nums [j ++ ];
338
+ }
339
+ ans += i - j + 1 ;
340
+ }
341
+ return ans ;
342
+ }
343
+ ```
344
+
345
+ #### Rust
346
+
347
+ ``` rust
348
+ impl Solution {
349
+ pub fn count_subarrays (nums : Vec <i32 >, k : i64 ) -> i64 {
350
+ let mut ans = 0i64 ;
351
+ let mut s = 0i64 ;
352
+ let mut j = 0 ;
353
+
354
+ for i in 0 .. nums . len () {
355
+ s += nums [i ] as i64 ;
356
+ while s * (i as i64 - j as i64 + 1 ) >= k {
357
+ s -= nums [j ] as i64 ;
358
+ j += 1 ;
359
+ }
360
+ ans += i as i64 - j as i64 + 1 ;
361
+ }
362
+
363
+ ans
364
+ }
365
+ }
366
+ ```
367
+
273
368
<!-- tabs: end -->
274
369
275
370
<!-- solution: end -->
0 commit comments