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 533e03a

Browse files
authored
feat: add rust solution to lc problem: No.0084 (doocs#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‎

Lines changed: 50 additions & 0 deletions
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‎

Lines changed: 50 additions & 0 deletions
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
Lines changed: 45 additions & 0 deletions
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)

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