7373
7474注意数据的溢出以及取模操作。
7575
76- 时间复杂度 $O(n),ドル其中 $n$ 表示数组 $arr$ 的长度。
76+ 时间复杂度 $O(n),ドル空间复杂度 $O(n)$。 其中 $n$ 为数组 $arr$ 的长度。
7777
7878<!-- tabs:start -->
7979
@@ -138,7 +138,7 @@ class Solution {
138138 }
139139 stk. push(i);
140140 }
141- int mod = (int ) 1e9 + 7 ;
141+ final int mod = (int ) 1e9 + 7 ;
142142 long ans = 0 ;
143143 for (int i = 0 ; i < n; ++ i) {
144144 ans += (long ) (i - left[i]) * (right[i] - i) % mod * arr[i] % mod;
@@ -152,9 +152,6 @@ class Solution {
152152### ** C++**
153153
154154``` cpp
155- using ll = long long ;
156- const int mod = 1e9 + 7 ;
157- 158155class Solution {
159156public:
160157 int sumSubarrayMins(vector<int >& arr) {
@@ -163,28 +160,160 @@ public:
163160 vector<int > right(n, n);
164161 stack<int > stk;
165162 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+ }
168169 stk.push(i);
169170 }
170171 stk = stack<int >();
171172 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+ }
174179 stk.push(i);
175180 }
176- ll ans = 0;
181+ long long ans = 0;
182+ const int mod = 1e9 + 7;
177183 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;
179185 ans %= mod;
180186 }
181187 return ans;
182188 }
183189};
184190```
185191
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+ 186271### ** Rust**
187272
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+ 188317``` rust
189318const MOD : i64 = (1e 9 as i64 ) + 7 ;
190319
@@ -236,70 +365,6 @@ impl Solution {
236365}
237366```
238367
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- 303368### ** ...**
304369
305370```
0 commit comments