代码随想录day48单调栈1
文章目录
- 739. 每日温度
- 496.下一个更大元素 I
- 503.下一个更大元素II
- 拓展求左边第一个最小的数
739. 每日温度
题目链接
题目链接
class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> stk;int n=temperatures.size();vector<int> ans(n,0);for(int i=0;i<n;i++){while(!stk.empty()&&temperatures[i]>temperatures[stk.top()]) {ans[stk.top()]=i-stk.top();stk.pop();}stk.push(i);}return ans;}
};
496.下一个更大元素 I
题目链接
文章讲解
暴力
class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {int m=nums1.size();int n=nums2.size();vector<int> ans(m,-1);stack<int> stk;int j=0;for(int i=0;i<m;i++){int k=0;for(int j=0;j<n;j++){if(nums1[i]==nums2[j]) k=j;}for(int j=k+1;j<n;j++){if(nums2[j]>nums2[k]) {ans[i]=nums2[j];break;}}}return ans;}
};
哈希加单调栈
class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {stack<int> st;vector<int> result(nums1.size(), -1);if (nums1.size() == 0) return result;unordered_map<int, int> umap; // key:下标元素,value:下标for (int i = 0; i < nums1.size(); i++) {umap[nums1[i]] = i;}st.push(0);for (int i = 1; i < nums2.size(); i++) {while (!st.empty() && nums2[i] > nums2[st.top()]) {if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标result[index] = nums2[i];}st.pop();}st.push(i);}return result;}
};
503.下一个更大元素II
题目链接
文章讲解
class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {int n=nums.size();vector<int> ans(n,-1);stack<int> stk;int max1=INT_MIN;for(int i=0;i<n;i++)max1=max(max1,nums[i]);int i=0;int cnt=0;while(1){while(!stk.empty()&&nums[i]>nums[stk.top()]){ans[stk.top()]=nums[i];stk.pop();}stk.push(i);i++;if(i==n) cnt++;i%=n;if(cnt==2) break;}return ans;}
};
如果想求右边第一个比它小的数 nums[i]>nums[stk.top()]改成nums[i]<nums[stk.top()]即可
拓展求左边第一个最小的数
如果想求左边第一个最小的数呢
求一个数左边第一个比他小的数
**
**
求左边第一个比他大的也改一下符号即可