坚持每天一道题,刷题学习Rust.
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3] 输出: 10
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
use std::cmp::{max, min};
struct Solution {}
impl Solution {
fn get_value(heights: &Vec<i32>, index: i32) -> i32 {
if index == -1 {
return 0;
}
return heights[index as usize];
}
fn top_minus_1(stack: &Vec<i32>) -> i32 {
return stack[stack.len() - 2];
}
pub fn largest_rectangle_area(heights: Vec<i32>) -> i32 {
let mut stack = Vec::new();
let mut max_area = 0;
stack.push(-1);
for i in heights.iter().enumerate() {
let mut top = *stack.last().expect("must have one");
let mut aj = Self::get_value(&heights, top);
let ai = *i.1;
if ai <= aj {
//出栈,计算面积
while aj > ai {
//a[stack[top]]*(i-stack[top-1]-1)
let area = heights[top as usize] * (i.0 as i32 - Self::top_minus_1(&stack) - 1);
max_area = max(max_area, area);
stack.pop();
top = *stack.last().expect("must have one");
aj = Self::get_value(&heights, top);
}
}
stack.push(i.0 as i32);
}
//最后检查一下站内是否还有剩余
while stack.len() > 1 {
//a[stack[top]]*(a.len()-stack[top-1]-1)
let mut top = *stack.last().expect("must have one") as usize;
let area = heights[top] * (heights.len() as i32 - Self::top_minus_1(&stack) - 1);
max_area = max(max_area, area);
stack.pop();
}
max_area
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test() {
let t = Solution::largest_rectangle_area(vec![2, 1, 5, 6, 2, 3]);
assert_eq!(t, 10);
let t = Solution::largest_rectangle_area(vec![2]);
assert_eq!(t, 2);
let t = Solution::largest_rectangle_area(vec![2, 1, 2]);
assert_eq!(t, 3);
}
}
递增栈递减栈用好了,真是一种魔术啊
欢迎关注我的github,本项目文章所有代码都可以找到.