@@ -66,17 +66,17 @@ tags:
6666
6767### 方法一:枚举右端点
6868
69- 由题意,我们可以知道,定界子数组的所有元素都在区间 ` [ minK, maxK] ` 中,且最小值一定为 ` minK ` ,最大值一定为 ` maxK ` 。
69+ 由题意,我们可以知道,定界子数组的所有元素都在区间 $ [ \textit{ minK}, \textit{ maxK} ] $ 中,且最小值一定为 $\textit{ minK}$ ,最大值一定为 $\textit{ maxK}$ 。
7070
71- 我们遍历数组 $nums$,统计以 ` nums[i] ` 为右端点的定界子数组的个数,然后将所有的个数相加即可。
71+ 我们遍历数组 $\textit{ nums} $,统计以 $\textit{ nums} [ i] $ 为右端点的定界子数组的个数,然后将所有的个数相加即可。
7272
7373具体实现逻辑如下:
7474
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 )$。累加所有的个数即可。
7878
79- 时间复杂度 $O(n)$,空间复杂度 $O(1)$。 其中 $n$ 为数组 $nums$ 的长度。
79+ 时间复杂度 $O(n)$,其中 $n$ 为数组 $\textit{ nums} $ 的长度。空间复杂度 $O(1)$ 。
8080
8181<!-- tabs:start -->
8282
@@ -130,10 +130,16 @@ public:
130130 long long countSubarrays(vector<int >& nums, int minK, int maxK) {
131131 long long ans = 0;
132132 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+ }
137143 ans += max(0, min(j1, j2) - k);
138144 }
139145 return ans;
@@ -167,23 +173,15 @@ func countSubarrays(nums []int, minK int, maxK int) int64 {
167173
168174``` ts
169175function 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 ;
187185}
188186```
189187
@@ -192,54 +190,45 @@ function countSubarrays(nums: number[], minK: number, maxK: number): number {
192190``` rust
193191impl Solution {
194192 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 () {
201198 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 ;
204201 }
205- if num == max_k {
206- max_index = i ;
202+ if v == min_k {
203+ j1 = i ;
207204 }
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 ;
210211 }
211- res += (0 ). max (min_index . min (max_index ) - k );
212212 }
213- res
213+ ans
214214 }
215215}
216216```
217217
218218#### C
219219
220220``` c
221- #define max (a, b ) (((a) > (b)) ? (a) : (b))
222- #define min(a, b) (((a) < (b)) ? (a) : (b))
223-
224221long 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);
241230 }
242- return res ;
231+ return ans ;
243232}
244233```
245234
0 commit comments