Skip to content

Commit 83a3bde

Browse files
authored
feat: add solutions to lc problem: No.2302 (#4344)
No.2302.Count Subarrays With Score Less Than K
1 parent 36ae5d1 commit 83a3bde

File tree

12 files changed

+364
-99
lines changed

12 files changed

+364
-99
lines changed

solution/2300-2399/2302.Count Subarrays With Score Less Than K/README.md

+129-34
Original file line numberDiff line numberDiff line change
@@ -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:
168168
func 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) {
207263
class 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
259315
func 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

Comments
 (0)