算法训练营day58_单调栈(3.24提前打)
739.每日温度
找到右边第一个比自己大的,用单调栈;
刚开始忘了怎么写了,直接单调队列过了。。
- 找到右边的元素,倒序遍历;
- 右小无用,所以先把栈里比自己小的给弹出去;
- 然后看栈顶有没有元素,有的话加进去,没有就赋0;
- 然后把自己放进栈里;
class Solution {
public:
int stk[100001],top;
vector<int> dailyTemperatures(vector<int>& temperatures) {
memset(stk,0,sizeof stk);
top=0;
int len=temperatures.size();
vector<int> ans;
for(int i=len-1;i>=0;i--){
while(top&&temperatures[i]>=temperatures[stk[top]]) top--;
if(top){
ans.push_back(stk[top]-i);
}
else ans.push_back(0);
stk[++top]=i;
}
reverse(ans.begin(),ans.end());
return ans;
}
};
496.下一个更大元素I
这道题暴力都可以解,很简单;
遍历nums1;
在nums2中找到nums1[i]的位置;
倒序遍历,看一下有没有右边第一个比nums2[goal]大的元素;
class Solution {
public:
int stk[1010];
int find(vector<int>& nums2,int x){
for(int i=0;i<nums2.size();i++){
if(nums2[i]==x){
return i;
}
}
return 0;
}
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> ans;
int n1=nums1.size(),n2=nums2.size();
for(int i=0;i<n1;i++){
int goal=find(nums2,nums1[i]);
memset(stk,0,sizeof stk);
int top=0;
for(int j=n2-1;j>=goal;j--){
while(top&&nums2[j]>=stk[top]) top--;
if(j==goal){
if(top) ans.push_back(stk[top]);
else ans.push_back(-1);
}
stk[++top]=nums2[j];
}
}
return ans;
}
};