File tree 3 files changed +145
-0
lines changed
solution/0000-0099/0084.Largest Rectangle in Histogram
3 files changed +145
-0
lines changed Original file line number Diff line number Diff line change @@ -158,6 +158,56 @@ public:
158
158
};
159
159
```
160
160
161
+ ### **Rust**
162
+
163
+ ```rust
164
+ impl Solution {
165
+ #[allow(dead_code)]
166
+ pub fn largest_rectangle_area(heights: Vec<i32>) -> i32 {
167
+ let n = heights.len();
168
+ let mut left = vec![-1; n];
169
+ let mut right = vec![-1; n];
170
+ let mut stack: Vec<(usize, i32)> = Vec::new();
171
+ let mut ret = -1;
172
+
173
+ // Build left vector
174
+ for (i, h) in heights.iter().enumerate() {
175
+ while !stack.is_empty() && stack.last().unwrap().1 >= *h {
176
+ stack.pop();
177
+ }
178
+ if stack.is_empty() {
179
+ left[i] = -1;
180
+ } else {
181
+ left[i] = stack.last().unwrap().0 as i32;
182
+ }
183
+ stack.push((i, *h));
184
+ }
185
+
186
+ stack.clear();
187
+
188
+ // Build right vector
189
+ for (i, h) in heights.iter().enumerate().rev() {
190
+ while !stack.is_empty() && stack.last().unwrap().1 >= *h {
191
+ stack.pop();
192
+ }
193
+ if stack.is_empty() {
194
+ right[i] = n as i32;
195
+ } else {
196
+ right[i] = stack.last().unwrap().0 as i32;
197
+ }
198
+ stack.push((i, *h));
199
+ }
200
+
201
+ // Calculate the max area
202
+ for (i, h) in heights.iter().enumerate() {
203
+ ret = std::cmp::max(ret, (right[i] - left[i] - 1) * *h);
204
+ }
205
+
206
+ ret
207
+ }
208
+ }
209
+ ```
210
+
161
211
### ** Go**
162
212
163
213
``` go
Original file line number Diff line number Diff line change @@ -128,6 +128,56 @@ public:
128
128
};
129
129
```
130
130
131
+ ### **Rust**
132
+
133
+ ```rust
134
+ impl Solution {
135
+ #[allow(dead_code)]
136
+ pub fn largest_rectangle_area(heights: Vec<i32>) -> i32 {
137
+ let n = heights.len();
138
+ let mut left = vec![-1; n];
139
+ let mut right = vec![-1; n];
140
+ let mut stack: Vec<(usize, i32)> = Vec::new();
141
+ let mut ret = -1;
142
+
143
+ // Build left vector
144
+ for (i, h) in heights.iter().enumerate() {
145
+ while !stack.is_empty() && stack.last().unwrap().1 >= *h {
146
+ stack.pop();
147
+ }
148
+ if stack.is_empty() {
149
+ left[i] = -1;
150
+ } else {
151
+ left[i] = stack.last().unwrap().0 as i32;
152
+ }
153
+ stack.push((i, *h));
154
+ }
155
+
156
+ stack.clear();
157
+
158
+ // Build right vector
159
+ for (i, h) in heights.iter().enumerate().rev() {
160
+ while !stack.is_empty() && stack.last().unwrap().1 >= *h {
161
+ stack.pop();
162
+ }
163
+ if stack.is_empty() {
164
+ right[i] = n as i32;
165
+ } else {
166
+ right[i] = stack.last().unwrap().0 as i32;
167
+ }
168
+ stack.push((i, *h));
169
+ }
170
+
171
+ // Calculate the max area
172
+ for (i, h) in heights.iter().enumerate() {
173
+ ret = std::cmp::max(ret, (right[i] - left[i] - 1) * *h);
174
+ }
175
+
176
+ ret
177
+ }
178
+ }
179
+ ```
180
+
131
181
### ** Go**
132
182
133
183
``` go
Original file line number Diff line number Diff line change
1
+ impl Solution {
2
+ #[ allow( dead_code) ]
3
+ pub fn largest_rectangle_area ( heights : Vec < i32 > ) -> i32 {
4
+ let n = heights. len ( ) ;
5
+ let mut left = vec ! [ -1 ; n] ;
6
+ let mut right = vec ! [ -1 ; n] ;
7
+ let mut stack: Vec < ( usize , i32 ) > = Vec :: new ( ) ;
8
+ let mut ret = -1 ;
9
+
10
+ // Build left vector
11
+ for ( i, h) in heights. iter ( ) . enumerate ( ) {
12
+ while !stack. is_empty ( ) && stack. last ( ) . unwrap ( ) . 1 >= * h {
13
+ stack. pop ( ) ;
14
+ }
15
+ if stack. is_empty ( ) {
16
+ left[ i] = -1 ;
17
+ } else {
18
+ left[ i] = stack. last ( ) . unwrap ( ) . 0 as i32 ;
19
+ }
20
+ stack. push ( ( i, * h) ) ;
21
+ }
22
+
23
+ stack. clear ( ) ;
24
+
25
+ // Build right vector
26
+ for ( i, h) in heights. iter ( ) . enumerate ( ) . rev ( ) {
27
+ while !stack. is_empty ( ) && stack. last ( ) . unwrap ( ) . 1 >= * h {
28
+ stack. pop ( ) ;
29
+ }
30
+ if stack. is_empty ( ) {
31
+ right[ i] = n as i32 ;
32
+ } else {
33
+ right[ i] = stack. last ( ) . unwrap ( ) . 0 as i32 ;
34
+ }
35
+ stack. push ( ( i, * h) ) ;
36
+ }
37
+
38
+ // Calculate the max area
39
+ for ( i, h) in heights. iter ( ) . enumerate ( ) {
40
+ ret = std:: cmp:: max ( ret, ( right[ i] - left[ i] - 1 ) * * h) ;
41
+ }
42
+
43
+ ret
44
+ }
45
+ }
You can’t perform that action at this time.
0 commit comments