-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStack- maxRectangleArea.cpp
More file actions
85 lines (70 loc) · 2 KB
/
Stack- maxRectangleArea.cpp
File metadata and controls
85 lines (70 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include<iostream>
#include<stack>
#include <vector>
#include <limits.h>
using namespace std;
vector<int> nextSmallerElement(int* arr, int n){
stack<int> s;
s.push(-1);
vector<int> ans;
for(int i= n-1; i>=0; i--){
int curr= arr[i];
while(s.top()!= -1 && arr[s.top()] >= curr){
s.pop();
}
ans[i]= s.top();
s.push(i);
}
return ans;
}
vector<int> prevSmallerElement(int* arr, int n){
stack<int> s;
s.push(-1);
vector<int> ans;
for(int i= 0; i<=n; i++){
int curr= arr[i];
while(s.top()!= -1 && arr[s.top()] >= curr){
s.pop();
}
ans[i]= s.top();
s.push(i);
}
return ans;
}//time complexity- O(n)
int largestRectangleArea(int* heights, int n){
//int n = heights.size();
vector<int> next(n);
next= nextSmallerElement(heights, n);
vector<int> prev(n);
prev= prevSmallerElement(heights, n);
int area= INT_MIN;
for(int i=0; i<n; i++){
int l= heights[i];
if(next[i]==-1){
next[i]= n;
}
int b= next[i]- prev[i] -1;
int newArea= l*b;
area= max(newArea, area);
}
return area;
}//time complexity- O(n)
int maxArea(int **M, int n, int m){
//area for first row
int area= largestRectangleArea(M[0], m);
//for remaining rows
for(int i=1; i<n; i++){
for(int j=0; j<m; j++){
//row update to make an array for histogram
if(M[i][j] != 0)
M[i][j]= M[i][j]+ M[i-1][j];
else
M[i][j]= 0;
}
area= max(area, largestRectangleArea(M[i], m));
}
return area;
}// time complexity- O(m*n)
//space complexity- O(n)
int main(){
}