739. 每日温度 - 力扣(LeetCode)//中等。之前哪道题讲过单调栈来着。忘记了。反正这题懂单调栈就能a,没什么难度
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> answer(temperatures.size(),0);
vector<int> st;
st.push_back(0);
for(int i=1;i<temperatures.size();i++){
while(!st.empty()&&temperatures[i]>temperatures[st.back()]){
answer[st.back()]=i-st.back();
st.pop_back();
}
st.push_back(i);
}
return answer;
}
};
496. 下一个更大元素 I - 力扣(LeetCode)//简单。如果要用单调栈的话,实现起来并不算特别简单。。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> ans(nums1.size(),-1);
unordered_map<int,int> map;
stack<int> st;
for(int i=0;i<nums1.size();i++){
map[nums1[i]]=i;
}
st.push(nums2[0]);
for(int i=1;i<nums2.size();i++){
while(!st.empty()&&nums2[i]>st.top()){
if(map.find(st.top())!=map.end()){
ans[map[st.top()]]=nums2[i];
}
st.pop();
}
st.push(nums2[i]);
}
return ans;
}
};
503. 下一个更大元素 II - 力扣(LeetCode)//中等。懒得想。直接跑两次,然后用余数区分一下即可。写完一看思路差不多。
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int> ans(nums.size(),-1);int i=1;
stack<int> st;
st.push(0);
while(i<2*nums.size()){
while(!st.empty()&&nums[i%nums.size()]>nums[st.top()]&&ans[st.top()]==-1){
ans[st.top()]=nums[i%nums.size()];
st.pop();
}
if(ans[i%nums.size()]==-1)
st.push(i%nums.size());
i++;
}
return ans;
}
};
42. 接雨水 - 力扣(LeetCode)//困难。难点在于知道单调栈之后如何妥当的计算面积
class Solution {
public:
int trap(vector<int>& height) {
int count=0;
vector<int> st;
st.reserve(height.size());
st.push_back(0);
for(int i=1;i<height.size();i++){
while(!st.empty()&&height[st.back()]<height[i]){//满足条件说明出现凹槽
int mintemp=st.back();
st.pop_back();
if(!st.empty()){
count+=((min(height[st.back()],height[i])-height[mintemp])*(i-st.back()-1));
}
}
st.push_back(i);
}
return count;
}
};
84. 柱状图中最大的矩形 - 力扣(LeetCode)//困难。虽然和接雨水有异曲同工之妙,但是边界处理比雨水要复杂一点。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
heights.insert(heights.begin(),0);
heights.push_back(0);
int count=0;
stack<int> st;
st.push(0);
for(int i=1;i<heights.size();i++){
while(!st.empty()&&heights[st.top()]>heights[i]){
int temp=st.top();
st.pop();
if(!st.empty())
count=max(count,(i-st.top()-1)*heights[temp]);
}
st.push(i);
}
return count;
}
};