mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
Merge pull request #2177 from Ainevsia/patch-4
Update 0084.柱状图中最大的矩形.md
This commit is contained in:
@ -670,6 +670,61 @@ function largestRectangleArea(heights: number[]): number {
|
||||
```
|
||||
|
||||
|
||||
Rust
|
||||
|
||||
双指针预处理
|
||||
```rust
|
||||
|
||||
impl Solution {
|
||||
pub fn largest_rectangle_area(v: Vec<i32>) -> i32 {
|
||||
let n = v.len();
|
||||
let mut left_smaller_idx = vec![-1; n];
|
||||
let mut right_smaller_idx = vec![n as i32; n];
|
||||
for i in 1..n {
|
||||
let mut mid = i as i32 - 1;
|
||||
while mid >= 0 && v[mid as usize] >= v[i] {
|
||||
mid = left_smaller_idx[mid as usize];
|
||||
}
|
||||
left_smaller_idx[i] = mid;
|
||||
}
|
||||
for i in (0..n-1).rev() {
|
||||
let mut mid = i + 1;
|
||||
while mid < n && v[mid] >= v[i] {
|
||||
mid = right_smaller_idx[mid] as usize;
|
||||
}
|
||||
right_smaller_idx[i] = mid as i32;
|
||||
}
|
||||
let mut res = 0;
|
||||
for (idx, &e) in v.iter().enumerate() {
|
||||
res = res.max((right_smaller_idx[idx] - left_smaller_idx[idx] - 1) * e);
|
||||
}
|
||||
dbg!(res)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
单调栈
|
||||
```rust
|
||||
impl Solution {
|
||||
pub fn largest_rectangle_area1(mut v: Vec<i32>) -> i32 {
|
||||
v.insert(0, 0); // 便于使第一个元素能够有左侧<=它的值
|
||||
v.push(0); // 便于在结束处理最后一个元素后清空残留在栈中的值
|
||||
let mut res = 0;
|
||||
let mut stack = vec![]; // 递增的栈
|
||||
for (idx, &e) in v.iter().enumerate() {
|
||||
while !stack.is_empty() && v[*stack.last().unwrap()] > e {
|
||||
let pos = stack.pop().unwrap();
|
||||
let prev_pos = *stack.last().unwrap();
|
||||
let s = (idx - prev_pos - 1) as i32 * v[pos];
|
||||
res = res.max(s);
|
||||
}
|
||||
stack.push(idx);
|
||||
}
|
||||
res
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
<p align="center">
|
||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||
|
Reference in New Issue
Block a user