Skip to content

Commit a785380

Browse files
authored
feat: update solutions to lc problem: No.2444
1 parent 3aad112 commit a785380

File tree

1 file changed

+50
-61
lines changed
  • solution/2400-2499/2444.Count Subarrays With Fixed Bounds

1 file changed

+50
-61
lines changed

solution/2400-2499/2444.Count Subarrays With Fixed Bounds/README.md

+50-61
Original file line numberDiff line numberDiff line change
@@ -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
169175
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;
187185
}
188186
```
189187

@@ -192,54 +190,45 @@ function countSubarrays(nums: number[], minK: number, maxK: number): number {
192190
```rust
193191
impl 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-
224221
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);
241230
}
242-
return res;
231+
return ans;
243232
}
244233
```
245234

0 commit comments

Comments
 (0)