Skip to content

Commit d932a9c

Browse files
authored
feat: add rust solution to lc problem: No.0085 (#1528)
1 parent 533e03a commit d932a9c

File tree

3 files changed

+235
-0
lines changed

3 files changed

+235
-0
lines changed

solution/0000-0099/0085.Maximal Rectangle/README.md

+80
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,86 @@ public:
194194
};
195195
```
196196

197+
### **Rust**
198+
199+
```rust
200+
impl Solution {
201+
#[allow(dead_code)]
202+
pub fn maximal_rectangle(matrix: Vec<Vec<char>>) -> i32 {
203+
let n = matrix[0].len();
204+
let mut heights = vec![0; n];
205+
let mut ret = -1;
206+
207+
for row in &matrix {
208+
Self::array_builder(row, &mut heights);
209+
ret = std::cmp::max(ret, Self::largest_rectangle_area(heights.clone()));
210+
}
211+
212+
ret
213+
}
214+
215+
/// Helper function, build the heights array according to the input
216+
#[allow(dead_code)]
217+
fn array_builder(input: &Vec<char>, heights: &mut Vec<i32>) {
218+
for (i, &c) in input.iter().enumerate() {
219+
heights[i] += match c {
220+
'1' => 1,
221+
'0' => {
222+
heights[i] = 0;
223+
0
224+
}
225+
_ => panic!("This is impossible"),
226+
};
227+
}
228+
}
229+
230+
/// Helper function, see: https://leetcode.com/problems/largest-rectangle-in-histogram/ for details
231+
#[allow(dead_code)]
232+
fn largest_rectangle_area(heights: Vec<i32>) -> i32 {
233+
let n = heights.len();
234+
let mut left = vec![-1; n];
235+
let mut right = vec![-1; n];
236+
let mut stack: Vec<(usize, i32)> = Vec::new();
237+
let mut ret = -1;
238+
239+
// Build left vector
240+
for (i, h) in heights.iter().enumerate() {
241+
while !stack.is_empty() && stack.last().unwrap().1 >= *h {
242+
stack.pop();
243+
}
244+
if stack.is_empty() {
245+
left[i] = -1;
246+
} else {
247+
left[i] = stack.last().unwrap().0 as i32;
248+
}
249+
stack.push((i, *h));
250+
}
251+
252+
stack.clear();
253+
254+
// Build right vector
255+
for (i, h) in heights.iter().enumerate().rev() {
256+
while !stack.is_empty() && stack.last().unwrap().1 >= *h {
257+
stack.pop();
258+
}
259+
if stack.is_empty() {
260+
right[i] = n as i32;
261+
} else {
262+
right[i] = stack.last().unwrap().0 as i32;
263+
}
264+
stack.push((i, *h));
265+
}
266+
267+
// Calculate the max area
268+
for (i, h) in heights.iter().enumerate() {
269+
ret = std::cmp::max(ret, (right[i] - left[i] - 1) * *h);
270+
}
271+
272+
ret
273+
}
274+
}
275+
```
276+
197277
### **Go**
198278

199279
```go

solution/0000-0099/0085.Maximal Rectangle/README_EN.md

+80
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,86 @@ public:
164164
};
165165
```
166166

167+
### **Rust**
168+
169+
```rust
170+
impl Solution {
171+
#[allow(dead_code)]
172+
pub fn maximal_rectangle(matrix: Vec<Vec<char>>) -> i32 {
173+
let n = matrix[0].len();
174+
let mut heights = vec![0; n];
175+
let mut ret = -1;
176+
177+
for row in &matrix {
178+
Self::array_builder(row, &mut heights);
179+
ret = std::cmp::max(ret, Self::largest_rectangle_area(heights.clone()));
180+
}
181+
182+
ret
183+
}
184+
185+
/// Helper function, build the heights array according to the input
186+
#[allow(dead_code)]
187+
fn array_builder(input: &Vec<char>, heights: &mut Vec<i32>) {
188+
for (i, &c) in input.iter().enumerate() {
189+
heights[i] += match c {
190+
'1' => 1,
191+
'0' => {
192+
heights[i] = 0;
193+
0
194+
}
195+
_ => panic!("This is impossible"),
196+
};
197+
}
198+
}
199+
200+
/// Helper function, see: https://leetcode.com/problems/largest-rectangle-in-histogram/ for details
201+
#[allow(dead_code)]
202+
fn largest_rectangle_area(heights: Vec<i32>) -> i32 {
203+
let n = heights.len();
204+
let mut left = vec![-1; n];
205+
let mut right = vec![-1; n];
206+
let mut stack: Vec<(usize, i32)> = Vec::new();
207+
let mut ret = -1;
208+
209+
// Build left vector
210+
for (i, h) in heights.iter().enumerate() {
211+
while !stack.is_empty() && stack.last().unwrap().1 >= *h {
212+
stack.pop();
213+
}
214+
if stack.is_empty() {
215+
left[i] = -1;
216+
} else {
217+
left[i] = stack.last().unwrap().0 as i32;
218+
}
219+
stack.push((i, *h));
220+
}
221+
222+
stack.clear();
223+
224+
// Build right vector
225+
for (i, h) in heights.iter().enumerate().rev() {
226+
while !stack.is_empty() && stack.last().unwrap().1 >= *h {
227+
stack.pop();
228+
}
229+
if stack.is_empty() {
230+
right[i] = n as i32;
231+
} else {
232+
right[i] = stack.last().unwrap().0 as i32;
233+
}
234+
stack.push((i, *h));
235+
}
236+
237+
// Calculate the max area
238+
for (i, h) in heights.iter().enumerate() {
239+
ret = std::cmp::max(ret, (right[i] - left[i] - 1) * *h);
240+
}
241+
242+
ret
243+
}
244+
}
245+
```
246+
167247
### **Go**
168248

169249
```go
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
impl Solution {
2+
#[allow(dead_code)]
3+
pub fn maximal_rectangle(matrix: Vec<Vec<char>>) -> i32 {
4+
let n = matrix[0].len();
5+
let mut heights = vec![0; n];
6+
let mut ret = -1;
7+
8+
for row in &matrix {
9+
Self::array_builder(row, &mut heights);
10+
ret = std::cmp::max(ret, Self::largest_rectangle_area(heights.clone()));
11+
}
12+
13+
ret
14+
}
15+
16+
/// Helper function, build the heights array according to the input
17+
#[allow(dead_code)]
18+
fn array_builder(input: &Vec<char>, heights: &mut Vec<i32>) {
19+
for (i, &c) in input.iter().enumerate() {
20+
heights[i] += match c {
21+
'1' => 1,
22+
'0' => {
23+
heights[i] = 0;
24+
0
25+
}
26+
_ => panic!("This is impossible"),
27+
};
28+
}
29+
}
30+
31+
/// Helper function, see: https://leetcode.com/problems/largest-rectangle-in-histogram/ for details
32+
#[allow(dead_code)]
33+
fn largest_rectangle_area(heights: Vec<i32>) -> i32 {
34+
let n = heights.len();
35+
let mut left = vec![-1; n];
36+
let mut right = vec![-1; n];
37+
let mut stack: Vec<(usize, i32)> = Vec::new();
38+
let mut ret = -1;
39+
40+
// Build left vector
41+
for (i, h) in heights.iter().enumerate() {
42+
while !stack.is_empty() && stack.last().unwrap().1 >= *h {
43+
stack.pop();
44+
}
45+
if stack.is_empty() {
46+
left[i] = -1;
47+
} else {
48+
left[i] = stack.last().unwrap().0 as i32;
49+
}
50+
stack.push((i, *h));
51+
}
52+
53+
stack.clear();
54+
55+
// Build right vector
56+
for (i, h) in heights.iter().enumerate().rev() {
57+
while !stack.is_empty() && stack.last().unwrap().1 >= *h {
58+
stack.pop();
59+
}
60+
if stack.is_empty() {
61+
right[i] = n as i32;
62+
} else {
63+
right[i] = stack.last().unwrap().0 as i32;
64+
}
65+
stack.push((i, *h));
66+
}
67+
68+
// Calculate the max area
69+
for (i, h) in heights.iter().enumerate() {
70+
ret = std::cmp::max(ret, (right[i] - left[i] - 1) * *h);
71+
}
72+
73+
ret
74+
}
75+
}

0 commit comments

Comments
 (0)