对应力扣剑指 Offer II 039. 直方图最大矩形面积
On2暴力解法
import java.util.Scanner;
/**
* @author 罗有冠
* @date 2022/11/04 0:36
*/
class Main {
static int maxValue = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[] nums = new int[N];
for (int i = 0; i < N; i++) {
nums[i] = scanner.nextInt();
}
for (int i = 0; i < N; i++) {
find(nums, i);
}
System.out.print(maxValue);
}
private static void find(int[] nums, int i) {
int left = i, right = i;
while (left >= 0 && nums[i] <= nums[left]) {
left--;
}
while (right < nums.length && nums[i] <= nums[right]) {
right++;
}
maxValue = Math.max(maxValue, nums[i] * (right - left - 1));
}
}
c语言
#include <iostream>
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include <algorithm>
#include<cstdlib>
#include<stack>
int main()
{
int n;
cin >> n;
int* height = new int[n];
for (int i = 0;i<n; i++) {
cin >> height[i];
}
stack<int> stack;
int* left = new int[n];
int* right = new int[n];
for (int i = 0; i < n; i++) {
while (!stack.empty()&&height[stack.top()]>=height[i]) {
stack.pop();
}
left[i] = stack.empty() ? -1:stack.top() ;
stack.push(i);
}
while (!stack.empty()) {
stack.pop();
}
for (int i = n-1; i >= 0; i--) {
while (!stack.empty() && height[stack.top()] >= height[i]) {
stack.pop();
}
right[i] = stack.empty() ? n : stack.top();
stack.push(i);
}
int ans = 0;
for (int i = 0; i < n; i++) {
ans = max(ans,height[i]*(right[i]-left[i]-1));
}
printf("%d", ans);
return 0;
}
java
import java.util.*;
/**
* @author 罗有冠
* @date 2022/9/29 0:36
*/
class Solution {
public int largestRectangleArea(int[] heights) {
// 搞一个单调栈
Deque<Integer> stack = new ArrayDeque<>();
// 每一个位置,两边都找出比当前值小的那个位置
int[] left = new int[heights.length];
int[] right = new int[heights.length];
// 先找left的内容,左往右
for (int i = 0; i < heights.length; i++) {
// 当栈不为空并且当前值比栈顶小,弹出
while (!stack.isEmpty() && heights[i] <= heights[stack.peek()]) {
stack.poll();
}
// 如果栈为空,存最左边界也就是-1,不为空那就存栈顶
// 栈顶就是左边第一个比当前高度小的位置
left[i] = (stack.isEmpty() ? -1 : stack.peek());
// 然后把当前位置存进栈
stack.push(i);
}
// 清空栈
stack.clear();
// 再找right内容,右往左
for (int i = heights.length - 1; i >= 0; i--) {
// 当栈不为空,并且当前值比栈顶小,弹出
while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {
stack.poll();
}
// 如果栈为空,存最右边界也就是length,不为空则存栈顶
// 栈顶就是右边第一个比当前高度小的位置
right[i] = stack.isEmpty() ? heights.length : stack.peek();
// 然后把当前位置存进栈
stack.push(i);
}
int ans = 0;
for (int i = 0; i < heights.length; i++) {
// 每个位置,它对应的最大面积就是(right[i] - left[i]-1) * heights[i]
// 找ans
ans = Math.max(ans, (right[i] - left[i]-1) * heights[i]);
}
return ans;
}
public static void main(String[] args) {
Solution solution = new Solution();
solution.largestRectangleArea(new int[]{2,1,5,6,2,3});
}
}