每日温度
题目链接:力扣
T是一个栈结构
单调栈里 存放元素的下标i,
如果需要使用对应的元素,直接T[i]就可以获取。
- 情况一:当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
则加入栈 - 情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
则加入栈 - 情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
则result[st.top()] = i - st.top()
并将当前的栈顶元素弹出
重复上述步骤,直到T[i]遇到大于它的栈顶元素,或者栈为空
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> Mystack;
vector<int>result(temperatures.size(),0);
Mystack.push(0);
for(int i=1;i<temperatures.size();i++)
{
if(temperatures[i] > temperatures[Mystack.top()]){
while(!Mystack.empty() && temperatures[i] > temperatures[Mystack.top()]) //当前元素大于栈顶元素
{
result[Mystack.top()] = i-Mystack.top();
Mystack.pop();
}
Mystack.push(i);
}
else if(temperatures[i] <= temperatures[Mystack.top()])
{
Mystack.push(i);
}
}
return result;
}
};
下一个更大元素 I
总体思路和上题一致,先得出nums2的result数组,再根据result推算出nums1各元素的下一个更大元素
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int>result(nums2.size(),0);
vector<int>res(nums1.size(),-1);
stack<int> ST;
ST.push(0);
for(int i=1 ; i<nums2.size();i++)
{
if(!ST.empty() && nums2[i] > nums2[ST.top()])
{
while(!ST.empty() && nums2[i] > nums2[ST.top()])
{
result[ST.top()] = i-ST.top();
ST.pop();
}
ST.push(i);
}
else
ST.push(i);
}
for(int i=0; i<nums1.size();i++)
for(int j=0;j<nums2.size();j++)
{
if(nums1[i] == nums2[j])
{
if(result[j] == 0)
res[i] = -1;
else
res[i] = nums2[j+result[j]];
}
}
return res;
}
};
卡哥采用了map数据结构,使代码更精简
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;
}
};