diff --git a/solution/0000-0099/0084.Largest Rectangle in Histogram/README.md b/solution/0000-0099/0084.Largest Rectangle in Histogram/README.md index 5ed84fdb5e16b..fdaf3faca134a 100644 --- a/solution/0000-0099/0084.Largest Rectangle in Histogram/README.md +++ b/solution/0000-0099/0084.Largest Rectangle in Histogram/README.md @@ -158,6 +158,56 @@ public: }; ``` +### **Rust** + +```rust +impl Solution { + #[allow(dead_code)] + pub fn largest_rectangle_area(heights: Vec) -> i32 { + let n = heights.len(); + let mut left = vec![-1; n]; + let mut right = vec![-1; n]; + let mut stack: Vec<(usize, i32)> = Vec::new(); + let mut ret = -1; + + // Build left vector + for (i, h) in heights.iter().enumerate() { + while !stack.is_empty() && stack.last().unwrap().1 >= *h { + stack.pop(); + } + if stack.is_empty() { + left[i] = -1; + } else { + left[i] = stack.last().unwrap().0 as i32; + } + stack.push((i, *h)); + } + + stack.clear(); + + // Build right vector + for (i, h) in heights.iter().enumerate().rev() { + while !stack.is_empty() && stack.last().unwrap().1 >= *h { + stack.pop(); + } + if stack.is_empty() { + right[i] = n as i32; + } else { + right[i] = stack.last().unwrap().0 as i32; + } + stack.push((i, *h)); + } + + // Calculate the max area + for (i, h) in heights.iter().enumerate() { + ret = std::cmp::max(ret, (right[i] - left[i] - 1) * *h); + } + + ret + } +} +``` + ### **Go** ```go diff --git a/solution/0000-0099/0084.Largest Rectangle in Histogram/README_EN.md b/solution/0000-0099/0084.Largest Rectangle in Histogram/README_EN.md index aeda64077b594..f303573069f67 100644 --- a/solution/0000-0099/0084.Largest Rectangle in Histogram/README_EN.md +++ b/solution/0000-0099/0084.Largest Rectangle in Histogram/README_EN.md @@ -128,6 +128,56 @@ public: }; ``` +### **Rust** + +```rust +impl Solution { + #[allow(dead_code)] + pub fn largest_rectangle_area(heights: Vec) -> i32 { + let n = heights.len(); + let mut left = vec![-1; n]; + let mut right = vec![-1; n]; + let mut stack: Vec<(usize, i32)> = Vec::new(); + let mut ret = -1; + + // Build left vector + for (i, h) in heights.iter().enumerate() { + while !stack.is_empty() && stack.last().unwrap().1 >= *h { + stack.pop(); + } + if stack.is_empty() { + left[i] = -1; + } else { + left[i] = stack.last().unwrap().0 as i32; + } + stack.push((i, *h)); + } + + stack.clear(); + + // Build right vector + for (i, h) in heights.iter().enumerate().rev() { + while !stack.is_empty() && stack.last().unwrap().1 >= *h { + stack.pop(); + } + if stack.is_empty() { + right[i] = n as i32; + } else { + right[i] = stack.last().unwrap().0 as i32; + } + stack.push((i, *h)); + } + + // Calculate the max area + for (i, h) in heights.iter().enumerate() { + ret = std::cmp::max(ret, (right[i] - left[i] - 1) * *h); + } + + ret + } +} +``` + ### **Go** ```go diff --git a/solution/0000-0099/0084.Largest Rectangle in Histogram/Solution.rs b/solution/0000-0099/0084.Largest Rectangle in Histogram/Solution.rs new file mode 100644 index 0000000000000..ef2e7d6cfdce0 --- /dev/null +++ b/solution/0000-0099/0084.Largest Rectangle in Histogram/Solution.rs @@ -0,0 +1,45 @@ +impl Solution { + #[allow(dead_code)] + pub fn largest_rectangle_area(heights: Vec) -> i32 { + let n = heights.len(); + let mut left = vec![-1; n]; + let mut right = vec![-1; n]; + let mut stack: Vec<(usize, i32)> = Vec::new(); + let mut ret = -1; + + // Build left vector + for (i, h) in heights.iter().enumerate() { + while !stack.is_empty() && stack.last().unwrap().1 >= *h { + stack.pop(); + } + if stack.is_empty() { + left[i] = -1; + } else { + left[i] = stack.last().unwrap().0 as i32; + } + stack.push((i, *h)); + } + + stack.clear(); + + // Build right vector + for (i, h) in heights.iter().enumerate().rev() { + while !stack.is_empty() && stack.last().unwrap().1 >= *h { + stack.pop(); + } + if stack.is_empty() { + right[i] = n as i32; + } else { + right[i] = stack.last().unwrap().0 as i32; + } + stack.push((i, *h)); + } + + // Calculate the max area + for (i, h) in heights.iter().enumerate() { + ret = std::cmp::max(ret, (right[i] - left[i] - 1) * *h); + } + + ret + } +} \ No newline at end of file