Skip to content

Commit 195919a

Browse files
committed
feat: add solutions to lc problems
* No.0907.Sum of Subarray Minimums * No.1856.Maximum Subarray Min-Product * No.2104.Sum of Subarray Ranges * No.2278.Percentage of Letter in String * No.2279.Maximum Bags With Full Capacity of Rocks * No.2280.Minimum Lines to Represent a Line Chart * No.2281.Sum of Total Strength of Wizards
1 parent dd2b059 commit 195919a

File tree

57 files changed

+2951
-202
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+2951
-202
lines changed

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@
5656
- [设计链表](/solution/0700-0799/0707.Design%20Linked%20List/README.md) - `单链表``指针引用``数组实现`
5757
- [下一个更大元素 I](/solution/0400-0499/0496.Next%20Greater%20Element%20I/README.md) - `单调栈`
5858
- [每日温度](/solution/0700-0799/0739.Daily%20Temperatures/README.md) - `单调栈`
59+
- [子数组的最小值之和](/solution/0900-0999/0907.Sum%20of%20Subarray%20Minimums/README.md) - `单调栈`
60+
- [子数组范围和](/solution/2100-2199/2104.Sum%20of%20Subarray%20Ranges/README.md) - `单调栈`
61+
- [子数组最小乘积的最大值](/solution/1800-1899/1856.Maximum%20Subarray%20Min-Product/README.md) - `单调栈`
5962
- [滑动窗口最大值](/solution/0200-0299/0239.Sliding%20Window%20Maximum/README.md) - `单调队列`
6063
- [满足不等式的最大值](/solution/1400-1499/1499.Max%20Value%20of%20Equation/README.md) - `单调队列`
6164
- [和至少为 K 的最短子数组](/solution/0800-0899/0862.Shortest%20Subarray%20with%20Sum%20at%20Least%20K/README.md) - `单调队列`

README_EN.md

+3
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
5454
- [Design Linked List](/solution/0700-0799/0707.Design%20Linked%20List/README_EN.md) - `Linked List`, `Pointer`, `Array`
5555
- [Next Greater Element I](/solution/0400-0499/0496.Next%20Greater%20Element%20I/README_EN.md) - `Monotonic Stack`
5656
- [Daily Temperatures](/solution/0700-0799/0739.Daily%20Temperatures/README_EN.md) - `Monotonic Stack`
57+
- [Sum of Subarray Minimums](/solution/0900-0999/0907.Sum%20of%20Subarray%20Minimums/README_EN.md) - `Monotonic Stack`
58+
- [Sum of Subarray Ranges](/solution/2100-2199/2104.Sum%20of%20Subarray%20Ranges/README_EN.md) - `Monotonic Stack`
59+
- [Maximum Subarray Min-Product](/solution/1800-1899/1856.Maximum%20Subarray%20Min-Product/README_EN.md) - `Monotonic Stack`
5760
- [Sliding Window Maximum](/solution/0200-0299/0239.Sliding%20Window%20Maximum/README_EN.md) - `Monotonic Queue`
5861
- [Max Value of Equation](/solution/1400-1499/1499.Max%20Value%20of%20Equation/README_EN.md) - `Monotonic Queue`
5962
- [Shortest Subarray with Sum at Least K](/solution/0800-0899/0862.Shortest%20Subarray%20with%20Sum%20at%20Least%20K/README_EN.md) - `Monotonic Queue`

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

+142-1
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,163 @@
4343

4444
<!-- 这里可写通用的实现逻辑 -->
4545

46+
**方法一:单调栈**
47+
48+
枚举 `arr[i]` 作为子数组的最小值,找出左侧第一个比 `arr[i]` 小的位置 `left[i]`,右侧第一个不大于 `arr[i]` 的位置 `right[i]`
49+
50+
计算每个 `arr[i]` 的贡献 `(i - left[i]) * (right[i] - i) * arr[i]`,累加得到结果。
51+
52+
注意数据溢出与取模操作。
53+
4654
<!-- tabs:start -->
4755

4856
### **Python3**
4957

5058
<!-- 这里可写当前语言的特殊实现逻辑 -->
5159

5260
```python
53-
61+
class Solution:
62+
def sumSubarrayMins(self, arr: List[int]) -> int:
63+
n = len(arr)
64+
left = [-1] * n
65+
right = [n] * n
66+
stk = []
67+
mod = int(1e9) + 7
68+
for i, v in enumerate(arr):
69+
while stk and arr[stk[-1]] >= v:
70+
stk.pop()
71+
if stk:
72+
left[i] = stk[-1]
73+
stk.append(i)
74+
stk = []
75+
for i in range(n - 1, -1, -1):
76+
while stk and arr[stk[-1]] > arr[i]:
77+
stk.pop()
78+
if stk:
79+
right[i] = stk[-1]
80+
stk.append(i)
81+
return sum((i - left[i]) * (right[i] - i) * v for i, v in enumerate(arr)) % mod
5482
```
5583

5684
### **Java**
5785

5886
<!-- 这里可写当前语言的特殊实现逻辑 -->
5987

6088
```java
89+
class Solution {
90+
public int sumSubarrayMins(int[] arr) {
91+
int n = arr.length;
92+
int[] left = new int[n];
93+
int[] right = new int[n];
94+
Arrays.fill(left, -1);
95+
Arrays.fill(right, n);
96+
Deque<Integer> stk = new ArrayDeque<>();
97+
for (int i = 0; i < n; ++i) {
98+
while (!stk.isEmpty() && arr[stk.peek()] >= arr[i]) {
99+
stk.pop();
100+
}
101+
if (!stk.isEmpty()) {
102+
left[i] = stk.peek();
103+
}
104+
stk.push(i);
105+
}
106+
stk.clear();
107+
for (int i = n - 1; i >= 0; --i) {
108+
while (!stk.isEmpty() && arr[stk.peek()] > arr[i]) {
109+
stk.pop();
110+
}
111+
if (!stk.isEmpty()) {
112+
right[i] = stk.peek();
113+
}
114+
stk.push(i);
115+
}
116+
int mod = (int) 1e9 + 7;
117+
long ans = 0;
118+
for (int i = 0; i < n; ++i) {
119+
ans += (long) (i - left[i]) * (right[i] - i) % mod * arr[i] % mod;
120+
ans %= mod;
121+
}
122+
return (int) ans;
123+
}
124+
}
125+
```
126+
127+
### **C++**
128+
129+
```cpp
130+
using ll = long long;
131+
const int mod = 1e9 + 7;
132+
133+
class Solution {
134+
public:
135+
int sumSubarrayMins(vector<int>& arr) {
136+
int n = arr.size();
137+
vector<int> left(n, -1);
138+
vector<int> right(n, n);
139+
stack<int> stk;
140+
for (int i = 0; i < n; ++i)
141+
{
142+
while (!stk.empty() && arr[stk.top()] >= arr[i]) stk.pop();
143+
if (!stk.empty()) left[i] = stk.top();
144+
stk.push(i);
145+
}
146+
stk = stack<int>();
147+
for (int i = n - 1; i >= 0; --i)
148+
{
149+
while (!stk.empty() && arr[stk.top()] > arr[i]) stk.pop();
150+
if (!stk.empty()) right[i] = stk.top();
151+
stk.push(i);
152+
}
153+
ll ans = 0;
154+
for (int i = 0; i < n; ++i)
155+
{
156+
ans += (ll) (i - left[i]) * (right[i] - i) * arr[i] % mod;
157+
ans %= mod;
158+
}
159+
return ans;
160+
}
161+
};
162+
```
61163
164+
### **Go**
165+
166+
```go
167+
func sumSubarrayMins(arr []int) int {
168+
mod := int(1e9) + 7
169+
n := len(arr)
170+
left := make([]int, n)
171+
right := make([]int, n)
172+
for i := range left {
173+
left[i] = -1
174+
right[i] = n
175+
}
176+
stk := []int{}
177+
for i, v := range arr {
178+
for len(stk) > 0 && arr[stk[len(stk)-1]] >= v {
179+
stk = stk[:len(stk)-1]
180+
}
181+
if len(stk) > 0 {
182+
left[i] = stk[len(stk)-1]
183+
}
184+
stk = append(stk, i)
185+
}
186+
stk = []int{}
187+
for i := n - 1; i >= 0; i-- {
188+
for len(stk) > 0 && arr[stk[len(stk)-1]] > arr[i] {
189+
stk = stk[:len(stk)-1]
190+
}
191+
if len(stk) > 0 {
192+
right[i] = stk[len(stk)-1]
193+
}
194+
stk = append(stk, i)
195+
}
196+
ans := 0
197+
for i, v := range arr {
198+
ans += (i - left[i]) * (right[i] - i) * v % mod
199+
ans %= mod
200+
}
201+
return ans
202+
}
62203
```
63204

64205
### **TypeScript**

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

+134-1
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,146 @@ Sum is 17.
4040
### **Python3**
4141

4242
```python
43-
43+
class Solution:
44+
def sumSubarrayMins(self, arr: List[int]) -> int:
45+
n = len(arr)
46+
left = [-1] * n
47+
right = [n] * n
48+
stk = []
49+
mod = int(1e9) + 7
50+
for i, v in enumerate(arr):
51+
while stk and arr[stk[-1]] >= v:
52+
stk.pop()
53+
if stk:
54+
left[i] = stk[-1]
55+
stk.append(i)
56+
stk = []
57+
for i in range(n - 1, -1, -1):
58+
while stk and arr[stk[-1]] > arr[i]:
59+
stk.pop()
60+
if stk:
61+
right[i] = stk[-1]
62+
stk.append(i)
63+
return sum((i - left[i]) * (right[i] - i) * v for i, v in enumerate(arr)) % mod
4464
```
4565

4666
### **Java**
4767

4868
```java
69+
class Solution {
70+
public int sumSubarrayMins(int[] arr) {
71+
int n = arr.length;
72+
int[] left = new int[n];
73+
int[] right = new int[n];
74+
Arrays.fill(left, -1);
75+
Arrays.fill(right, n);
76+
Deque<Integer> stk = new ArrayDeque<>();
77+
for (int i = 0; i < n; ++i) {
78+
while (!stk.isEmpty() && arr[stk.peek()] >= arr[i]) {
79+
stk.pop();
80+
}
81+
if (!stk.isEmpty()) {
82+
left[i] = stk.peek();
83+
}
84+
stk.push(i);
85+
}
86+
stk.clear();
87+
for (int i = n - 1; i >= 0; --i) {
88+
while (!stk.isEmpty() && arr[stk.peek()] > arr[i]) {
89+
stk.pop();
90+
}
91+
if (!stk.isEmpty()) {
92+
right[i] = stk.peek();
93+
}
94+
stk.push(i);
95+
}
96+
int mod = (int) 1e9 + 7;
97+
long ans = 0;
98+
for (int i = 0; i < n; ++i) {
99+
ans += (long) (i - left[i]) * (right[i] - i) % mod * arr[i] % mod;
100+
ans %= mod;
101+
}
102+
return (int) ans;
103+
}
104+
}
105+
```
106+
107+
### **C++**
108+
109+
```cpp
110+
using ll = long long;
111+
const int mod = 1e9 + 7;
112+
113+
class Solution {
114+
public:
115+
int sumSubarrayMins(vector<int>& arr) {
116+
int n = arr.size();
117+
vector<int> left(n, -1);
118+
vector<int> right(n, n);
119+
stack<int> stk;
120+
for (int i = 0; i < n; ++i)
121+
{
122+
while (!stk.empty() && arr[stk.top()] >= arr[i]) stk.pop();
123+
if (!stk.empty()) left[i] = stk.top();
124+
stk.push(i);
125+
}
126+
stk = stack<int>();
127+
for (int i = n - 1; i >= 0; --i)
128+
{
129+
while (!stk.empty() && arr[stk.top()] > arr[i]) stk.pop();
130+
if (!stk.empty()) right[i] = stk.top();
131+
stk.push(i);
132+
}
133+
ll ans = 0;
134+
for (int i = 0; i < n; ++i)
135+
{
136+
ans += (ll) (i - left[i]) * (right[i] - i) * arr[i] % mod;
137+
ans %= mod;
138+
}
139+
return ans;
140+
}
141+
};
142+
```
49143
144+
### **Go**
145+
146+
```go
147+
func sumSubarrayMins(arr []int) int {
148+
mod := int(1e9) + 7
149+
n := len(arr)
150+
left := make([]int, n)
151+
right := make([]int, n)
152+
for i := range left {
153+
left[i] = -1
154+
right[i] = n
155+
}
156+
stk := []int{}
157+
for i, v := range arr {
158+
for len(stk) > 0 && arr[stk[len(stk)-1]] >= v {
159+
stk = stk[:len(stk)-1]
160+
}
161+
if len(stk) > 0 {
162+
left[i] = stk[len(stk)-1]
163+
}
164+
stk = append(stk, i)
165+
}
166+
stk = []int{}
167+
for i := n - 1; i >= 0; i-- {
168+
for len(stk) > 0 && arr[stk[len(stk)-1]] > arr[i] {
169+
stk = stk[:len(stk)-1]
170+
}
171+
if len(stk) > 0 {
172+
right[i] = stk[len(stk)-1]
173+
}
174+
stk = append(stk, i)
175+
}
176+
ans := 0
177+
for i, v := range arr {
178+
ans += (i - left[i]) * (right[i] - i) * v % mod
179+
ans %= mod
180+
}
181+
return ans
182+
}
50183
```
51184

52185
### **TypeScript**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using ll = long long;
2+
const int mod = 1e9 + 7;
3+
4+
class Solution {
5+
public:
6+
int sumSubarrayMins(vector<int>& arr) {
7+
int n = arr.size();
8+
vector<int> left(n, -1);
9+
vector<int> right(n, n);
10+
stack<int> stk;
11+
for (int i = 0; i < n; ++i)
12+
{
13+
while (!stk.empty() && arr[stk.top()] >= arr[i]) stk.pop();
14+
if (!stk.empty()) left[i] = stk.top();
15+
stk.push(i);
16+
}
17+
stk = stack<int>();
18+
for (int i = n - 1; i >= 0; --i)
19+
{
20+
while (!stk.empty() && arr[stk.top()] > arr[i]) stk.pop();
21+
if (!stk.empty()) right[i] = stk.top();
22+
stk.push(i);
23+
}
24+
ll ans = 0;
25+
for (int i = 0; i < n; ++i)
26+
{
27+
ans += (ll) (i - left[i]) * (right[i] - i) * arr[i] % mod;
28+
ans %= mod;
29+
}
30+
return ans;
31+
}
32+
};

0 commit comments

Comments
 (0)