Skip to content

Commit 533e03a

Browse files
authoredAug 28, 2023
feat: add rust solution to lc problem: No.0084 (#1527)
1 parent 22cc6fb commit 533e03a

File tree

3 files changed

+145
-0
lines changed

3 files changed

+145
-0
lines changed
 

‎solution/0000-0099/0084.Largest Rectangle in Histogram/README.md

+50
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,56 @@ public:
158158
};
159159
```
160160
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+
161211
### **Go**
162212

163213
```go

‎solution/0000-0099/0084.Largest Rectangle in Histogram/README_EN.md

+50
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,56 @@ public:
128128
};
129129
```
130130
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+
131181
### **Go**
132182

133183
```go
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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+
}

0 commit comments

Comments
 (0)