@@ -77,11 +77,11 @@ tags:
7777
7878### 方法一:前缀和 + 二分查找
7979
80- 我们先计算出数组 $nums$ 的前缀和数组 $s$,其中 $s[ i] $ 表示数组 $nums$ 前 $i$ 个元素的和。
80+ 我们先计算出数组 $\textit{ nums} $ 的前缀和数组 $s$,其中 $s[ i] $ 表示数组 $\textit{ nums} $ 前 $i$ 个元素的和。
8181
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$ 相加即为答案。
8383
84- 时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $nums$ 的长度。
84+ 时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $\textit{ nums} $ 的长度。
8585
8686<!-- tabs:start -->
8787
@@ -93,14 +93,14 @@ class Solution:
9393 s = list (accumulate(nums, initial = 0 ))
9494 ans = 0
9595 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
9999 if (s[i] - s[i - mid]) * mid < k:
100- left = mid
100+ l = mid
101101 else :
102- right = mid - 1
103- ans += left
102+ r = mid - 1
103+ ans += l
104104 return ans
105105```
106106
@@ -116,16 +116,16 @@ class Solution {
116116 }
117117 long ans = 0 ;
118118 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 ;
122122 if ((s[i] - s[i - mid]) * mid < k) {
123- left = mid;
123+ l = mid;
124124 } else {
125- right = mid - 1 ;
125+ r = mid - 1 ;
126126 }
127127 }
128- ans += left ;
128+ ans += l ;
129129 }
130130 return ans;
131131 }
@@ -146,16 +146,16 @@ public:
146146 }
147147 long long ans = 0;
148148 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;
152152 if ((s[ i] - s[ i - mid] ) * mid < k) {
153- left = mid;
153+ l = mid;
154154 } else {
155- right = mid - 1;
155+ r = mid - 1;
156156 }
157157 }
158- ans += left ;
158+ ans += l ;
159159 }
160160 return ans;
161161 }
@@ -168,25 +168,81 @@ public:
168168func countSubarrays(nums []int, k int64) (ans int64) {
169169 n := len(nums)
170170 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 )
173173 }
174174 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
178178 if (s[i]-s[i-mid])*int64(mid) < k {
179- left = mid
179+ l = mid
180180 } else {
181- right = mid - 1
181+ r = mid - 1
182182 }
183183 }
184- ans += int64(left )
184+ ans += int64(l )
185185 }
186186 return
187187}
188188```
189189
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+
190246<!-- tabs: end -->
191247
192248<!-- solution: end -->
@@ -197,7 +253,7 @@ func countSubarrays(nums []int, k int64) (ans int64) {
197253
198254我们可以使用双指针的方式,维护一个滑动窗口,使得窗口内的元素和小于 $k$。那么以当前元素为最后一个元素的子数组个数即为窗口的长度,我们将所有的窗口长度相加即为答案。
199255
200- 时间复杂度 $O(n)$,其中 $n$ 为数组 $nums$ 的长度。空间复杂度 $O(1)$。
256+ 时间复杂度 $O(n)$,其中 $n$ 为数组 $\textit{ nums} $ 的长度。空间复杂度 $O(1)$。
201257
202258<!-- tabs: start -->
203259
@@ -207,8 +263,8 @@ func countSubarrays(nums []int, k int64) (ans int64) {
207263class Solution :
208264 def countSubarrays (self , nums : List[int ], k : int ) -> int :
209265 ans = s = j = 0
210- for i, v in enumerate (nums):
211- s += v
266+ for i, x in enumerate (nums):
267+ s += x
212268 while s * (i - j + 1 ) >= k:
213269 s -= nums[j]
214270 j += 1
@@ -258,8 +314,8 @@ public:
258314```go
259315func countSubarrays(nums []int, k int64) (ans int64) {
260316 s, j := 0, 0
261- for i, v := range nums {
262- s += v
317+ for i, x := range nums {
318+ s += x
263319 for int64(s*(i-j+1)) >= k {
264320 s -= nums[j]
265321 j++
@@ -270,6 +326,45 @@ func countSubarrays(nums []int, k int64) (ans int64) {
270326}
271327```
272328
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+
273368<!-- tabs: end -->
274369
275370<!-- solution: end -->
0 commit comments