算法基础
单调栈:栈顶到栈底保持递增或递减的一个栈,通常用于一维数组,找到右边第一个满足特征的值之类的
739 每日温度
题目链接
思路
首先想到双重循环遍历。优化:需要记录遍历过程中第一个更大的数。因此使用单调栈。
操作过程:首元素入栈->下一个元素判定-> 当前遍历元素大于栈顶元素 ? 是:栈顶元素出栈,记录,当前元素入栈; 否:当前元素入栈
文章详解
cpp
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> answer(temperatures.size(),0);
stack<int> st;
if(temperatures.size() == 0){
return answer;
}
st.push(0);
for(int i = 1; i < temperatures.size(); i++)
{
if(temperatures[i] <= temperatures[st.top()]){
st.push(i);
}
else{
while(!st.empty() && temperatures[st.top()] < temperatures[i]) //注意加判断st为空
{
answer[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
}
return answer;
}
};
496 下一个更大元素
题目链接
思路
根据nums2 来维护单调栈,根据nums1建立一个map便于查询。
文章详解
cpp
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
题目链接
cpp
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int> result(nums.size(), -1);
if (nums.size() == 0) return result;
stack<int> st;
st.push(0);
for (int i = 1; i < nums.size() * 2; i++) {
// 模拟遍历两边nums,注意一下都是用i % nums.size()来操作
if (nums[i % nums.size()] < nums[st.top()]) st.push(i % nums.size());
else if (nums[i % nums.size()] == nums[st.top()]) st.push(i % nums.size());
else {
while (!st.empty() && nums[i % nums.size()] > nums[st.top()]) {
result[st.top()] = nums[i % nums.size()];
st.pop();
}
st.push(i % nums.size());
}
}
return result;
}
};