-
单调栈:通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。
-
单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素(如果遇到更小的就先存着,并不断动态处理栈顶,栈顶解决了再往回回退处理),优点是整个数组只需要遍历一次。
739. 每日温度
暴力超时。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> ans(temperatures.size(), 0);
for (int i = 0; i < temperatures.size(); i++) {
for (int j = i + 1; j < temperatures.size(); j++) {
if (temperatures[j] > temperatures[i]) {
ans[i] = j - i;
break;
}
}
}
return ans;
}
};
单调栈,注意栈里只存下标,数值通过T[i]取,另外遍历元素和栈元素相等也要放进去,因为题目考虑大于当前温度,等于不做记录。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
stack<int> st;
vector<int> res(T.size(), 0);
st.push(0);
for (int i = 1; i < T.size(); i++) {
if (T[i] <= T[st.top()]) {
st.push(i);
} else {
while (!st.empty() && T[i] > T[st.top()]) {
res[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
}
return res;
}
};
496.下一个更大元素 I
一遍过,用map保存一下映射关系。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
int map[10001] = {-1};
//unordered_map<int, int> umap;
//umap.count(nums2[st.top()]) > 0 存在元素
vector<int> res(nums1.size(), -1);
vector<int> next = doit(nums2);
for (int i = 0; i < nums2.size(); i++) {
map[nums2[i]] = i;
}
for (int i = 0; i < nums1.size(); i++) {
if (map[nums1[i]] != -1) {
res[i] = next[map[nums1[i]]];
}
}
return res;
}
vector<int> doit(vector<int> & T) {
vector<int> ans(T.size(), -1);
stack<int> st;
st.push(0);
for (int i = 1; i < T.size(); i++) {
while (!st.empty() && T[st.top()] < T[i]) {
ans[st.top()] = T[i];
st.pop();
}
st.push(i);
}
return ans;
}
};