Skip to content

Commit 90cb7b1

Browse files
committed
feat: add solutions to lc problem: No.2302
No.2302.Count Subarrays With Score Less Than K
1 parent 485ff19 commit 90cb7b1

File tree

6 files changed

+195
-118
lines changed

6 files changed

+195
-118
lines changed

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

Lines changed: 90 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@
6060

6161
**方法一:前缀和 + 二分查找**
6262

63+
我们先计算出数组 `nums` 的前缀和数组 $s$,其中 $s[i]$ 表示数组 `nums` 前 $i$ 个元素的和。
64+
65+
接下来,我们枚举数组 `nums` 每个元素作为子数组的最后一个元素,对于每个元素,我们可以通过二分查找的方式找到最大的长度 $l$,使得 $s[i] - s[i - l] \times l < k$。那么以该元素为最后一个元素的子数组个数即为 $l$,我们将所有的 $l$ 相加即为答案。
66+
67+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 `nums` 的长度。
68+
69+
**方法二:双指针**
70+
71+
我们可以使用双指针的方式,维护一个滑动窗口,使得窗口内的元素和小于 $k$。那么以当前元素为最后一个元素的子数组个数即为窗口的长度,我们将所有的窗口长度相加即为答案。
72+
73+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 `nums` 的长度。
74+
6375
<!-- tabs:start -->
6476

6577
### **Python3**
@@ -71,10 +83,8 @@ class Solution:
7183
def countSubarrays(self, nums: List[int], k: int) -> int:
7284
s = list(accumulate(nums, initial=0))
7385
ans = 0
74-
for i in range(1, len(nums) + 1):
75-
if nums[i - 1] >= k:
76-
continue
77-
left, right = 1, i
86+
for i in range(1, len(s)):
87+
left, right = 0, i
7888
while left < right:
7989
mid = (left + right + 1) >> 1
8090
if (s[i] - s[i - mid]) * mid < k:
@@ -85,6 +95,19 @@ class Solution:
8595
return ans
8696
```
8797

98+
```python
99+
class Solution:
100+
def countSubarrays(self, nums: List[int], k: int) -> int:
101+
ans = s = j = 0
102+
for i, v in enumerate(nums):
103+
s += v
104+
while s * (i - j + 1) >= k:
105+
s -= nums[j]
106+
j += 1
107+
ans += i - j + 1
108+
return ans
109+
```
110+
88111
### **Java**
89112

90113
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -99,10 +122,7 @@ class Solution {
99122
}
100123
long ans = 0;
101124
for (int i = 1; i <= n; ++i) {
102-
if (nums[i - 1] >= k) {
103-
continue;
104-
}
105-
int left = 1, right = i;
125+
int left = 0, right = i;
106126
while (left < right) {
107127
int mid = (left + right + 1) >> 1;
108128
if ((s[i] - s[i - mid]) * mid < k) {
@@ -118,27 +138,44 @@ class Solution {
118138
}
119139
```
120140

141+
```java
142+
class Solution {
143+
public long countSubarrays(int[] nums, long k) {
144+
long ans = 0, s = 0;
145+
for (int i = 0, j = 0; i < nums.length; ++i) {
146+
s += nums[i];
147+
while (s * (i - j + 1) >= k) {
148+
s -= nums[j++];
149+
}
150+
ans += i - j + 1;
151+
}
152+
return ans;
153+
}
154+
}
155+
```
156+
121157
### **C++**
122158

123159
```cpp
124-
using ll = long long;
125-
126160
class Solution {
127161
public:
128162
long long countSubarrays(vector<int>& nums, long long k) {
129163
int n = nums.size();
130-
vector<ll> s(n + 1);
131-
for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i];
132-
ll ans = 0;
164+
long long s[n + 1];
165+
s[0] = 0;
166+
for (int i = 0; i < n; ++i) {
167+
s[i + 1] = s[i] + nums[i];
168+
}
169+
long long ans = 0;
133170
for (int i = 1; i <= n; ++i) {
134-
if (nums[i - 1] >= k) continue;
135-
int left = 1, right = i;
171+
int left = 0, right = i;
136172
while (left < right) {
137173
int mid = (left + right + 1) >> 1;
138-
if ((s[i] - s[i - mid]) * mid < k)
174+
if ((s[i] - s[i - mid]) * mid < k) {
139175
left = mid;
140-
else
176+
} else {
141177
right = mid - 1;
178+
}
142179
}
143180
ans += left;
144181
}
@@ -147,21 +184,34 @@ public:
147184
};
148185
```
149186
187+
```cpp
188+
class Solution {
189+
public:
190+
long long countSubarrays(vector<int>& nums, long long k) {
191+
long long ans = 0, s = 0;
192+
for (int i = 0, j = 0; i < nums.size(); ++i) {
193+
s += nums[i];
194+
while (s * (i - j + 1) >= k) {
195+
s -= nums[j++];
196+
}
197+
ans += i - j + 1;
198+
}
199+
return ans;
200+
}
201+
};
202+
```
203+
150204
### **Go**
151205

152206
```go
153-
func countSubarrays(nums []int, k int64) int64 {
207+
func countSubarrays(nums []int, k int64) (ans int64) {
154208
n := len(nums)
155209
s := make([]int64, n+1)
156210
for i, v := range nums {
157211
s[i+1] = s[i] + int64(v)
158212
}
159-
ans := 0
160213
for i := 1; i <= n; i++ {
161-
if s[i]-s[i-1] >= k {
162-
continue
163-
}
164-
left, right := 1, i
214+
left, right := 0, i
165215
for left < right {
166216
mid := (left + right + 1) >> 1
167217
if (s[i]-s[i-mid])*int64(mid) < k {
@@ -170,9 +220,24 @@ func countSubarrays(nums []int, k int64) int64 {
170220
right = mid - 1
171221
}
172222
}
173-
ans += left
223+
ans += int64(left)
224+
}
225+
return
226+
}
227+
```
228+
229+
```go
230+
func countSubarrays(nums []int, k int64) (ans int64) {
231+
s, j := 0, 0
232+
for i, v := range nums {
233+
s += v
234+
for int64(s*(i-j+1)) >= k {
235+
s -= nums[j]
236+
j++
237+
}
238+
ans += int64(i - j + 1)
174239
}
175-
return int64(ans)
240+
return
176241
}
177242
```
178243

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

Lines changed: 78 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,8 @@ class Solution:
6161
def countSubarrays(self, nums: List[int], k: int) -> int:
6262
s = list(accumulate(nums, initial=0))
6363
ans = 0
64-
for i in range(1, len(nums) + 1):
65-
if nums[i - 1] >= k:
66-
continue
67-
left, right = 1, i
64+
for i in range(1, len(s)):
65+
left, right = 0, i
6866
while left < right:
6967
mid = (left + right + 1) >> 1
7068
if (s[i] - s[i - mid]) * mid < k:
@@ -75,6 +73,19 @@ class Solution:
7573
return ans
7674
```
7775

76+
```python
77+
class Solution:
78+
def countSubarrays(self, nums: List[int], k: int) -> int:
79+
ans = s = j = 0
80+
for i, v in enumerate(nums):
81+
s += v
82+
while s * (i - j + 1) >= k:
83+
s -= nums[j]
84+
j += 1
85+
ans += i - j + 1
86+
return ans
87+
```
88+
7889
### **Java**
7990

8091
```java
@@ -87,10 +98,7 @@ class Solution {
8798
}
8899
long ans = 0;
89100
for (int i = 1; i <= n; ++i) {
90-
if (nums[i - 1] >= k) {
91-
continue;
92-
}
93-
int left = 1, right = i;
101+
int left = 0, right = i;
94102
while (left < right) {
95103
int mid = (left + right + 1) >> 1;
96104
if ((s[i] - s[i - mid]) * mid < k) {
@@ -106,27 +114,44 @@ class Solution {
106114
}
107115
```
108116

117+
```java
118+
class Solution {
119+
public long countSubarrays(int[] nums, long k) {
120+
long ans = 0, s = 0;
121+
for (int i = 0, j = 0; i < nums.length; ++i) {
122+
s += nums[i];
123+
while (s * (i - j + 1) >= k) {
124+
s -= nums[j++];
125+
}
126+
ans += i - j + 1;
127+
}
128+
return ans;
129+
}
130+
}
131+
```
132+
109133
### **C++**
110134

111135
```cpp
112-
using ll = long long;
113-
114136
class Solution {
115137
public:
116138
long long countSubarrays(vector<int>& nums, long long k) {
117139
int n = nums.size();
118-
vector<ll> s(n + 1);
119-
for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i];
120-
ll ans = 0;
140+
long long s[n + 1];
141+
s[0] = 0;
142+
for (int i = 0; i < n; ++i) {
143+
s[i + 1] = s[i] + nums[i];
144+
}
145+
long long ans = 0;
121146
for (int i = 1; i <= n; ++i) {
122-
if (nums[i - 1] >= k) continue;
123-
int left = 1, right = i;
147+
int left = 0, right = i;
124148
while (left < right) {
125149
int mid = (left + right + 1) >> 1;
126-
if ((s[i] - s[i - mid]) * mid < k)
150+
if ((s[i] - s[i - mid]) * mid < k) {
127151
left = mid;
128-
else
152+
} else {
129153
right = mid - 1;
154+
}
130155
}
131156
ans += left;
132157
}
@@ -135,21 +160,34 @@ public:
135160
};
136161
```
137162
163+
```cpp
164+
class Solution {
165+
public:
166+
long long countSubarrays(vector<int>& nums, long long k) {
167+
long long ans = 0, s = 0;
168+
for (int i = 0, j = 0; i < nums.size(); ++i) {
169+
s += nums[i];
170+
while (s * (i - j + 1) >= k) {
171+
s -= nums[j++];
172+
}
173+
ans += i - j + 1;
174+
}
175+
return ans;
176+
}
177+
};
178+
```
179+
138180
### **Go**
139181

140182
```go
141-
func countSubarrays(nums []int, k int64) int64 {
183+
func countSubarrays(nums []int, k int64) (ans int64) {
142184
n := len(nums)
143185
s := make([]int64, n+1)
144186
for i, v := range nums {
145187
s[i+1] = s[i] + int64(v)
146188
}
147-
ans := 0
148189
for i := 1; i <= n; i++ {
149-
if s[i]-s[i-1] >= k {
150-
continue
151-
}
152-
left, right := 1, i
190+
left, right := 0, i
153191
for left < right {
154192
mid := (left + right + 1) >> 1
155193
if (s[i]-s[i-mid])*int64(mid) < k {
@@ -158,9 +196,24 @@ func countSubarrays(nums []int, k int64) int64 {
158196
right = mid - 1
159197
}
160198
}
161-
ans += left
199+
ans += int64(left)
200+
}
201+
return
202+
}
203+
```
204+
205+
```go
206+
func countSubarrays(nums []int, k int64) (ans int64) {
207+
s, j := 0, 0
208+
for i, v := range nums {
209+
s += v
210+
for int64(s*(i-j+1)) >= k {
211+
s -= nums[j]
212+
j++
213+
}
214+
ans += int64(i - j + 1)
162215
}
163-
return int64(ans)
216+
return
164217
}
165218
```
166219

solution/2300-2399/2302.Count Subarrays With Score Less Than K/Solution.cpp

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,13 @@
1-
using ll = long long;
2-
31
class Solution {
42
public:
53
long long countSubarrays(vector<int>& nums, long long k) {
6-
int n = nums.size();
7-
vector<ll> s(n + 1);
8-
for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i];
9-
ll ans = 0;
10-
for (int i = 1; i <= n; ++i) {
11-
if (nums[i - 1] >= k) continue;
12-
int left = 1, right = i;
13-
while (left < right) {
14-
int mid = (left + right + 1) >> 1;
15-
if ((s[i] - s[i - mid]) * mid < k)
16-
left = mid;
17-
else
18-
right = mid - 1;
4+
long long ans = 0, s = 0;
5+
for (int i = 0, j = 0; i < nums.size(); ++i) {
6+
s += nums[i];
7+
while (s * (i - j + 1) >= k) {
8+
s -= nums[j++];
199
}
20-
ans += left;
10+
ans += i - j + 1;
2111
}
2212
return ans;
2313
}

0 commit comments

Comments
 (0)