73
73
74
74
注意数据的溢出以及取模操作。
75
75
76
- 时间复杂度 $O(n)$,其中 $n$ 表示数组 $arr$ 的长度。
76
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。 其中 $n$ 为数组 $arr$ 的长度。
77
77
78
78
<!-- tabs:start -->
79
79
@@ -138,7 +138,7 @@ class Solution {
138
138
}
139
139
stk. push(i);
140
140
}
141
- int mod = (int ) 1e9 + 7 ;
141
+ final int mod = (int ) 1e9 + 7 ;
142
142
long ans = 0 ;
143
143
for (int i = 0 ; i < n; ++ i) {
144
144
ans += (long ) (i - left[i]) * (right[i] - i) % mod * arr[i] % mod;
@@ -152,9 +152,6 @@ class Solution {
152
152
### ** C++**
153
153
154
154
``` cpp
155
- using ll = long long ;
156
- const int mod = 1e9 + 7 ;
157
-
158
155
class Solution {
159
156
public:
160
157
int sumSubarrayMins(vector<int >& arr) {
@@ -163,28 +160,160 @@ public:
163
160
vector<int > right(n, n);
164
161
stack<int > stk;
165
162
for (int i = 0; i < n; ++i) {
166
- while (!stk.empty() && arr[ stk.top()] >= arr[ i] ) stk.pop();
167
- if (!stk.empty()) left[ i] = stk.top();
163
+ while (!stk.empty() && arr[ stk.top()] >= arr[ i] ) {
164
+ stk.pop();
165
+ }
166
+ if (!stk.empty()) {
167
+ left[ i] = stk.top();
168
+ }
168
169
stk.push(i);
169
170
}
170
171
stk = stack<int >();
171
172
for (int i = n - 1; i >= 0; --i) {
172
- while (!stk.empty() && arr[ stk.top()] > arr[ i] ) stk.pop();
173
- if (!stk.empty()) right[ i] = stk.top();
173
+ while (!stk.empty() && arr[ stk.top()] > arr[ i] ) {
174
+ stk.pop();
175
+ }
176
+ if (!stk.empty()) {
177
+ right[ i] = stk.top();
178
+ }
174
179
stk.push(i);
175
180
}
176
- ll ans = 0;
181
+ long long ans = 0;
182
+ const int mod = 1e9 + 7;
177
183
for (int i = 0; i < n; ++i) {
178
- ans += (ll) (i - left[ i] ) * (right[ i] - i) * arr[ i] % mod;
184
+ ans += 1LL * (i - left[ i] ) * (right[ i] - i) * arr[ i] % mod;
179
185
ans %= mod;
180
186
}
181
187
return ans;
182
188
}
183
189
};
184
190
```
185
191
192
+ ### **Go**
193
+
194
+ ```go
195
+ func sumSubarrayMins(arr []int) (ans int) {
196
+ n := len(arr)
197
+ left := make([]int, n)
198
+ right := make([]int, n)
199
+ for i := range left {
200
+ left[i] = -1
201
+ right[i] = n
202
+ }
203
+ stk := []int{}
204
+ for i, v := range arr {
205
+ for len(stk) > 0 && arr[stk[len(stk)-1]] >= v {
206
+ stk = stk[:len(stk)-1]
207
+ }
208
+ if len(stk) > 0 {
209
+ left[i] = stk[len(stk)-1]
210
+ }
211
+ stk = append(stk, i)
212
+ }
213
+ stk = []int{}
214
+ for i := n - 1; i >= 0; i-- {
215
+ for len(stk) > 0 && arr[stk[len(stk)-1]] > arr[i] {
216
+ stk = stk[:len(stk)-1]
217
+ }
218
+ if len(stk) > 0 {
219
+ right[i] = stk[len(stk)-1]
220
+ }
221
+ stk = append(stk, i)
222
+ }
223
+ const mod int = 1e9 + 7
224
+ for i, v := range arr {
225
+ ans += (i - left[i]) * (right[i] - i) * v % mod
226
+ ans %= mod
227
+ }
228
+ return
229
+ }
230
+ ```
231
+
232
+ ### ** TypeScript**
233
+
234
+ ``` ts
235
+ function sumSubarrayMins(arr : number []): number {
236
+ const n: number = arr .length ;
237
+ const left: number [] = Array (n ).fill (- 1 );
238
+ const right: number [] = Array (n ).fill (n );
239
+ const stk: number [] = [];
240
+ for (let i = 0 ; i < n ; ++ i ) {
241
+ while (stk .length > 0 && arr [stk .at (- 1 )] >= arr [i ]) {
242
+ stk .pop ();
243
+ }
244
+ if (stk .length > 0 ) {
245
+ left [i ] = stk .at (- 1 );
246
+ }
247
+ stk .push (i );
248
+ }
249
+
250
+ stk .length = 0 ;
251
+ for (let i = n - 1 ; ~ i ; -- i ) {
252
+ while (stk .length > 0 && arr [stk .at (- 1 )] > arr [i ]) {
253
+ stk .pop ();
254
+ }
255
+ if (stk .length > 0 ) {
256
+ right [i ] = stk .at (- 1 );
257
+ }
258
+ stk .push (i );
259
+ }
260
+
261
+ const mod: number = 1e9 + 7 ;
262
+ let ans: number = 0 ;
263
+ for (let i = 0 ; i < n ; ++ i ) {
264
+ ans += ((((i - left [i ]) * (right [i ] - i )) % mod ) * arr [i ]) % mod ;
265
+ ans %= mod ;
266
+ }
267
+ return ans ;
268
+ }
269
+ ```
270
+
186
271
### ** Rust**
187
272
273
+ ``` rust
274
+ use std :: collections :: VecDeque ;
275
+
276
+ impl Solution {
277
+ pub fn sum_subarray_mins (arr : Vec <i32 >) -> i32 {
278
+ let n = arr . len ();
279
+ let mut left = vec! [- 1 ; n ];
280
+ let mut right = vec! [n as i32 ; n ];
281
+ let mut stk : VecDeque <usize > = VecDeque :: new ();
282
+
283
+ for i in 0 .. n {
284
+ while ! stk . is_empty () && arr [* stk . back (). unwrap ()] >= arr [i ] {
285
+ stk . pop_back ();
286
+ }
287
+ if let Some (& top ) = stk . back () {
288
+ left [i ] = top as i32 ;
289
+ }
290
+ stk . push_back (i );
291
+ }
292
+
293
+ stk . clear ();
294
+ for i in (0 .. n ). rev () {
295
+ while ! stk . is_empty () && arr [* stk . back (). unwrap ()] > arr [i ] {
296
+ stk . pop_back ();
297
+ }
298
+ if let Some (& top ) = stk . back () {
299
+ right [i ] = top as i32 ;
300
+ }
301
+ stk . push_back (i );
302
+ }
303
+
304
+ let MOD = 1_000_000_007 ;
305
+ let mut ans : i64 = 0 ;
306
+ for i in 0 .. n {
307
+ ans +=
308
+ ((((right [i ] - (i as i32 )) * ((i as i32 ) - left [i ])) as i64 ) * (arr [i ] as i64 )) %
309
+ MOD ;
310
+ ans %= MOD ;
311
+ }
312
+ ans as i32
313
+ }
314
+ }
315
+ ```
316
+
188
317
``` rust
189
318
const MOD : i64 = (1e 9 as i64 ) + 7 ;
190
319
@@ -236,70 +365,6 @@ impl Solution {
236
365
}
237
366
```
238
367
239
- ### ** Go**
240
-
241
- ``` go
242
- func sumSubarrayMins (arr []int ) int {
243
- mod := int (1e9 ) + 7
244
- n := len (arr)
245
- left := make ([]int , n)
246
- right := make ([]int , n)
247
- for i := range left {
248
- left[i] = -1
249
- right[i] = n
250
- }
251
- stk := []int {}
252
- for i , v := range arr {
253
- for len (stk) > 0 && arr[stk[len (stk)-1 ]] >= v {
254
- stk = stk[:len (stk)-1 ]
255
- }
256
- if len (stk) > 0 {
257
- left[i] = stk[len (stk)-1 ]
258
- }
259
- stk = append (stk, i)
260
- }
261
- stk = []int {}
262
- for i := n - 1 ; i >= 0 ; i-- {
263
- for len (stk) > 0 && arr[stk[len (stk)-1 ]] > arr[i] {
264
- stk = stk[:len (stk)-1 ]
265
- }
266
- if len (stk) > 0 {
267
- right[i] = stk[len (stk)-1 ]
268
- }
269
- stk = append (stk, i)
270
- }
271
- ans := 0
272
- for i , v := range arr {
273
- ans += (i - left[i]) * (right[i] - i) * v % mod
274
- ans %= mod
275
- }
276
- return ans
277
- }
278
- ```
279
-
280
- ### ** TypeScript**
281
-
282
- ``` ts
283
- function sumSubarrayMins(arr : number []): number {
284
- const n = arr .length ;
285
- function getEle(i : number ): number {
286
- if (i == - 1 || i == n ) return Number .MIN_SAFE_INTEGER;
287
- return arr [i ];
288
- }
289
- let ans = 0 ;
290
- const mod = 10 ** 9 + 7 ;
291
- let stack = [];
292
- for (let i = - 1 ; i <= n ; i ++ ) {
293
- while (stack .length && getEle (stack [0 ]) > getEle (i )) {
294
- const idx = stack .shift ();
295
- ans = (ans + arr [idx ] * (idx - stack [0 ]) * (i - idx )) % mod ;
296
- }
297
- stack .unshift (i );
298
- }
299
- return ans ;
300
- }
301
- ```
302
-
303
368
### ** ...**
304
369
305
370
```
0 commit comments