Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d72b849

Browse files
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‎

Lines changed: 140 additions & 75 deletions
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+
finalint 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)

AltStyle によって変換されたページ (->オリジナル) /