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 d932a9c

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

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

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

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