84.柱状图中最大的矩形
双指针法:
不扶还是有点做不出来。。。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
vector<int>minLeftIndex(heights.size(),0);
vector<int>minRightIndex(heights.size(),0);
int size = heights.size();
minLeftIndex[0] = -1;
for(int i = 1;i < size; i++){
int t = i - 1;
while(t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t];
minLeftIndex[i] = t;
}
minRightIndex[size - 1] = size;
for(int i = size - 2;i >= 0;i--){
int t = i + 1;
while(t < size && heights[t] >= heights[i])t = minRightIndex[t];
minRightIndex[i] = t;
}
int result = 0;
for(int i = 0;i < size;i++){
int left = minLeftIndex[i];
int right = minRightIndex[i];
int sum = heights[i] * (right - left - 1);
result = max(result,sum);
}
return result;
}
};
先拆开写,理解一下思路
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int result = 0;
stack<int>st;
heights.insert(heights.begin(),0);
heights.push_back(0);
st.push(0);
int size = heights.size();
for(int i = 1;i< size;i++){
if(heights[i] > heights[st.top()])st.push(i);
else if(heights[i] == heights[st.top()]){
st.pop();
st.push(i);
}
else{
//直到height[i]是最大的,这样可以保证栈里是从小到大(最外面最大)
while(!st.empty() && heights[i] < heights[st.top()]){
int mid = st.top();
st.pop();
if(!st.empty()){
int left = st.top();
int right = i;
int w = right - left -1;
int h = heights[mid];
result = max(result,w * h);
}
}
st.push(i);
}
}
return result;
}
};
默写!!
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int result = 0;
stack<int>st;
heights.insert(heights.begin(),0);
heights.push_back(0);
st.push(0);
for(int i = 1;i < heights.size();i++){
while(!st.empty() && heights[i] < heights[st.top()]){
int mid = st.top();
st.pop();
if(!st.empty()){
int left = st.top();
int right = i;
int w = right - left - 1;
int h = heights[mid];
result = max(result,w * h);
}
}
st.push(i);
}
return result;
}
};
还行,一次默写对了,随想录那个不考虑st.empty()的情况,因为加入的是0,所以里面至少有两个数?第一个是0(加入的),第二个是大于height[i]的,意味着比0大。所以st.top()肯定不是第一个0。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> st;
heights.insert(heights.begin(), 0); // 数组头部加入元素0
heights.push_back(0); // 数组尾部加入元素0
st.push(0);
int result = 0;
for (int i = 1; i < heights.size(); i++) {
while (heights[i] < heights[st.top()]) {
int mid = st.top();
st.pop();
int w = i - st.top() - 1;
int h = heights[mid];
result = max(result, w * h);
}
st.push(i);
}
return result;
}
};