@@ -66,17 +66,17 @@ tags:
66
66
67
67
### 方法一:枚举右端点
68
68
69
- 由题意,我们可以知道,定界子数组的所有元素都在区间 ` [ minK, maxK] ` 中,且最小值一定为 ` minK ` ,最大值一定为 ` maxK ` 。
69
+ 由题意,我们可以知道,定界子数组的所有元素都在区间 $ [ \textit{ minK}, \textit{ maxK} ] $ 中,且最小值一定为 $\textit{ minK}$ ,最大值一定为 $\textit{ maxK}$ 。
70
70
71
- 我们遍历数组 $nums$,统计以 ` nums[i] ` 为右端点的定界子数组的个数,然后将所有的个数相加即可。
71
+ 我们遍历数组 $\textit{ nums} $,统计以 $\textit{ nums} [ i] $ 为右端点的定界子数组的个数,然后将所有的个数相加即可。
72
72
73
73
具体实现逻辑如下:
74
74
75
- 1 . 维护最近一个不在区间 ` [ minK, maxK] ` 中的元素的下标 $k$,初始值为 $-1$。那么当前元素 ` nums[i] ` 的左端点一定大于 $k$。
76
- 1 . 维护最近一个值为 ` minK ` 的下标 $j_1$,最近一个值为 ` maxK ` 的下标 $j_2$,初始值均为 $-1$。那么当前元素 ` nums[i] ` 的左端点一定小于等于 $\min(j_1, j_2)$。
77
- 1 . 综上可知,以当前元素为右端点的定界子数组的个数为 $\max(0, \min(j_1, j_2) - k)$。累加所有的个数即可。
75
+ 1 . 维护最近一个不在区间 $ [ \textit{ minK}, \textit{ maxK} ] $ 中的元素的下标 $k$,初始值为 $-1$。那么当前元素 $\textit{ nums} [ i] $ 的左端点一定大于 $k$。
76
+ 2 . 维护最近一个值为 $\textit{ minK}$ 的下标 $j_1$,最近一个值为 $\textit{ maxK}$ 的下标 $j_2$,初始值均为 $-1$。那么当前元素 $\textit{ nums} [ i] $ 的左端点一定小于等于 $\min(j_1, j_2)$。
77
+ 3 . 综上可知,以当前元素为右端点的定界子数组的个数为 $\max\bigl (0,\ \min(j_1, j_2) - k\bigr )$。累加所有的个数即可。
78
78
79
- 时间复杂度 $O(n)$,空间复杂度 $O(1)$。 其中 $n$ 为数组 $nums$ 的长度。
79
+ 时间复杂度 $O(n)$,其中 $n$ 为数组 $\textit{ nums} $ 的长度。空间复杂度 $O(1)$ 。
80
80
81
81
<!-- tabs:start -->
82
82
@@ -130,10 +130,16 @@ public:
130
130
long long countSubarrays(vector<int >& nums, int minK, int maxK) {
131
131
long long ans = 0;
132
132
int j1 = -1, j2 = -1, k = -1;
133
- for (int i = 0; i < nums.size(); ++i) {
134
- if (nums[ i] < minK || nums[ i] > maxK) k = i;
135
- if (nums[ i] == minK) j1 = i;
136
- if (nums[ i] == maxK) j2 = i;
133
+ for (int i = 0; i < static_cast<int >(nums.size()); ++i) {
134
+ if (nums[ i] < minK || nums[ i] > maxK) {
135
+ k = i;
136
+ }
137
+ if (nums[ i] == minK) {
138
+ j1 = i;
139
+ }
140
+ if (nums[ i] == maxK) {
141
+ j2 = i;
142
+ }
137
143
ans += max(0, min(j1, j2) - k);
138
144
}
139
145
return ans;
@@ -167,23 +173,15 @@ func countSubarrays(nums []int, minK int, maxK int) int64 {
167
173
168
174
``` ts
169
175
function countSubarrays(nums : number [], minK : number , maxK : number ): number {
170
- let res = 0 ;
171
- let minIndex = - 1 ;
172
- let maxIndex = - 1 ;
173
- let k = - 1 ;
174
- nums .forEach ((num , i ) => {
175
- if (num === minK ) {
176
- minIndex = i ;
177
- }
178
- if (num === maxK ) {
179
- maxIndex = i ;
180
- }
181
- if (num < minK || num > maxK ) {
182
- k = i ;
183
- }
184
- res += Math .max (Math .min (minIndex , maxIndex ) - k , 0 );
185
- });
186
- return res ;
176
+ let ans = 0 ;
177
+ let [j1, j2, k] = [- 1 , - 1 , - 1 ];
178
+ for (let i = 0 ; i < nums .length ; ++ i ) {
179
+ if (nums [i ] < minK || nums [i ] > maxK ) k = i ;
180
+ if (nums [i ] === minK ) j1 = i ;
181
+ if (nums [i ] === maxK ) j2 = i ;
182
+ ans += Math .max (0 , Math .min (j1 , j2 ) - k );
183
+ }
184
+ return ans ;
187
185
}
188
186
```
189
187
@@ -192,54 +190,45 @@ function countSubarrays(nums: number[], minK: number, maxK: number): number {
192
190
``` rust
193
191
impl Solution {
194
192
pub fn count_subarrays (nums : Vec <i32 >, min_k : i32 , max_k : i32 ) -> i64 {
195
- let mut res = 0 ;
196
- let mut min_index = - 1 ;
197
- let mut max_index = - 1 ;
198
- let mut k = - 1 ;
199
- for i in 0 .. nums . len () {
200
- let num = nums [i ];
193
+ let mut ans : i64 = 0 ;
194
+ let mut j1 : i64 = - 1 ;
195
+ let mut j2 : i64 = - 1 ;
196
+ let mut k : i64 = - 1 ;
197
+ for (i , & v ) in nums . iter (). enumerate () {
201
198
let i = i as i64 ;
202
- if num == min_k {
203
- min_index = i ;
199
+ if v < min_k || v > max_k {
200
+ k = i ;
204
201
}
205
- if num == max_k {
206
- max_index = i ;
202
+ if v == min_k {
203
+ j1 = i ;
207
204
}
208
- if num < min_k || num > max_k {
209
- k = i ;
205
+ if v == max_k {
206
+ j2 = i ;
207
+ }
208
+ let m = j1 . min (j2 );
209
+ if m > k {
210
+ ans += m - k ;
210
211
}
211
- res += (0 ). max (min_index . min (max_index ) - k );
212
212
}
213
- res
213
+ ans
214
214
}
215
215
}
216
216
```
217
217
218
218
#### C
219
219
220
220
``` c
221
- #define max (a, b ) (((a) > (b)) ? (a) : (b))
222
- #define min(a, b) (((a) < (b)) ? (a) : (b))
223
-
224
221
long long countSubarrays (int* nums, int numsSize, int minK, int maxK) {
225
- long long res = 0;
226
- int minIndex = -1;
227
- int maxIndex = -1;
228
- int k = -1;
229
- for (int i = 0; i < numsSize; i++) {
230
- int num = nums[ i] ;
231
- if (num == minK) {
232
- minIndex = i;
233
- }
234
- if (num == maxK) {
235
- maxIndex = i;
236
- }
237
- if (num < minK || num > maxK) {
238
- k = i;
239
- }
240
- res += max(min(minIndex, maxIndex) - k, 0);
222
+ long long ans = 0;
223
+ int j1 = -1, j2 = -1, k = -1;
224
+ for (int i = 0; i < numsSize; ++i) {
225
+ if (nums[ i] < minK || nums[ i] > maxK) k = i;
226
+ if (nums[ i] == minK) j1 = i;
227
+ if (nums[ i] == maxK) j2 = i;
228
+ int m = j1 < j2 ? j1 : j2;
229
+ if (m > k) ans += (long long) (m - k);
241
230
}
242
- return res ;
231
+ return ans ;
243
232
}
244
233
```
245
234
0 commit comments