Skip to content

Commit d72b849

Browse files
authoredNov 27, 2023
feat: add solutions to lc problem: No.0907 (doocs#2021)
No.0907.Sum of Subarray Minimums
1 parent ec465a3 commit d72b849

File tree

7 files changed

+401
-257
lines changed

7 files changed

+401
-257
lines changed
 

‎solution/0900-0999/0907.Sum of Subarray Minimums/README.md

+140-75
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
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-
158155
class Solution {
159156
public:
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
189318
const MOD: i64 = (1e9 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

Comments
 (0)