class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
stack<int>st;
vector<int>ret(n,-1);
if(n == 0)return ret;
for(int i = 0; i < n*2;i ){
while(!st.empty() && nums[i % n] > nums[st.top()]){
ret[st.top()] = nums[i % n];
st.pop();
}
st.push(i % n);
}
return ret;
}
};
42. 接雨水
代码语言:javascript复制
class Solution {
public:
int trap(vector<int>& height) {
// 找每个柱子左右两边第一个大于该柱子高度的柱子
int n = height.size();
int ret = 0;
stack<int>st;
st.push(0);
for(int i = 1; i < n ;i ){
if(height[i] < height[st.top()]){
st.push(i);
}else if(height[i] == height[st.top()]){// 相同的更新边界,相当于合并区间
st.pop();// 加不加都可,但是处理相同情况的思想不同,这里略
st.push(i);
}else{// 大于左边界,即找到右边界
while(!st.empty() && height[i] > height[st.top()]){
int mid = height[st.top()];// 当做底
st.pop();
if(!st.empty()){
// 选取小的计算高度
int h = min(height[i],height[st.top()])-mid;
// 宽度
int w = i - st.top() - 1;
ret = h * w;
}
}
st.push(i);
}
}
return ret;
}
};
精简版
代码语言:javascript复制
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
int ret = 0;
stack<int>st;
st.push(0);
for(int i = 1; i < n ;i ){
while(!st.empty() && height[i] > height[st.top()]){
int mid = height[st.top()];// 当做底
st.pop();
if(!st.empty()){
// 选取小的计算高度
int h = min(height[i],height[st.top()])-mid;
// 宽度
int w = i - st.top() - 1;
ret = h * w;
}
}
st.push(i);
}
return ret;
}
};
84. 柱状图中最大的矩形
代码语言:javascript复制
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
// 找到每个数的,左边第一个更小的,右边第一个更小的,找雨水相反找两边更大的
// 计算面积为,这个数的值为高,右边第一个小的到它的距离为宽,依次求得面积
// 实际的面积大小就是一个数以及它与它右边第一个数中间可覆盖的面积
// 例如示例1中的值5到2,先计算出6的,6x1=2,然后计算5的5x()
// 左右填充0为了每个值都能找到左右更小的
heights.insert(heights.begin(),0);
heights.push_back(0);
stack<int>st;
st.push(0);
int ret = 0;
for(int i = 1; i < heights.size() ;i ){
if(heights[i] > heights[st.top()]){
st.push(i);
}else if(heights[i] == heights[st.top()]){// 相等向右合并
st.pop();
st.push(i);
}else{
// 判断小于栈顶的元素 和 栈顶元素,以及栈顶元素下一位,求得所有计算需要的值
while(!st.empty() && heights[i] < heights[st.top()]){
int h = heights[st.top()];// 高
st.pop();
if(!st.empty()){
int left = st.top();
int right = i;
int w = right-left-1;
ret = max(ret,w*h);
}
}
st.push(i);// 放入的时候满足大于栈顶元素
}
}
return ret;
}
};
精简版
代码语言:javascript复制
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
heights.insert(heights.begin(),0);
heights.push_back(0);
stack<int>st;
st.push(0);
int ret = 0;
for(int i = 1; i < heights.size() ;i ){
while(!st.empty() && heights[i] < heights[st.top()]){
int h = heights[st.top()];// 高
st.pop();
if(!st.empty()){
int left = st.top();
int right = i;
int w = right-left-1;
ret = max(ret,w*h);
}
}
st.push(i);
}
return ret;
}
};