心得
- 单调栈尤其适用于一维数组求左边、右边第一个比其大或小的元素类题目
题解
- 通过空间换时间,遍历到当前不知道前面元素大小,所以用栈来保存遍历过的元素的索引,从栈顶到底递增排序,保证出栈的元素一定是大于的第一个元素
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> result(temperatures.size(), 0);
st.push(0);
for (int i = 1; i < temperatures.size(); i++) {
if (temperatures[i] < temperatures[st.top()]) {
st.push(i);
} else if (temperatures[i] == temperatures[st.top()]) {
st.push(i);
}
else {
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
result[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
}
return result;
}
};
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> result(temperatures.size(), 0);
st.push(0);
for (int i = 1; i < temperatures.size(); i++) {
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
result[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
return result;
}
};
心得
题解
- 相比上体,绕了点,栈还是存索引,同样递增栈,其实递减栈求得是右边第一个小的
- 还是所有元素入栈,大于的时候相关元素出栈处理,不相关直接出栈,即只要大于就要处理,保持递增
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> result(nums1.size(), -1)
stack<int> st
if (nums1.size() == 0) return result
st.push(0)
unordered_map<int, int> umap
for (int i = 0
umap[nums1[i]] = i
}
for (int i = 1
while (!st.empty() && nums2[i] > nums2[st.top()]) {
if (umap.count(nums2[st.top()]) > 0) {
int index = umap[nums2[st.top()]]
result[index] = nums2[i]
}
st.pop()
}
st.push(i)
}
return result
}
}