每日温度
leetcode:739. 每日温度
单调栈
思路
单调栈,存放元素下标。
遍历一遍,每个元素和栈顶元素比较:
<=栈顶元素,入栈
>栈顶元素,result[st.top()] = i - st.top();弹出 继续,直到遍历结束或<=栈顶元素
代码实现
class Solution {
public:
/*
单调栈,存放元素下标
遍历一遍,每个元素和栈顶元素比较:
<=栈顶元素,入栈
>栈顶元素,result[st.top()] = i - st.top();弹出 继续,直到遍历结束或<=栈顶元素
*/
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> result(temperatures.size(),0);
st.push(0);
for(int i = 0;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;
}
};
下一个更大元素Ⅰ
leetcode:496. 下一个更大元素 I
暴力法
复杂度分析
时间复杂度:接近O(N^3)
空间复杂度:O(1)。没有额外空间
代码实现
class Solution {
public:
/*
遍历nums1,找到对应的nums2位置
在nums2里寻找右侧第一个最大元素
*/
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> result(nums1.size(),-1);
for(int i = 0;i < nums1.size();i++){
for(int j = 0;j < nums2.size();j++){
if(nums1[i] == nums2[j]){
for(int k = j+1;k < nums2.size();k++){
if(nums2[k] > nums2[j]){
result[i] = nums2[k];
break;
}
}
}
}
}
return result;
}
};
单调栈
复杂度分析
时间复杂度:O(N)。
空间复杂度:O(N)。
代码实现
class Solution {
public:
/*
先建立映射map(nums1元素值->nums1元素下标) 这样就可以通过num2元素值找到nums1对应位置了
然后就是对nums2的单调栈找下一个更大元素
*/
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> st;
vector<int> result(nums1.size(),-1);
unordered_map<int,int> map;
// 建立映射
for(int i = 0;i < nums1.size();i++){
map[nums1[i]] = i;
}
st.push(0); // stack放nums2下标
for(int i = 1;i < nums2.size();i++){
while(!st.empty() && nums2[i] > nums2[st.top()]){
// 如果st.top()在nums1里,记录结果
// 在top这个位置记录下一个元素值
if(map.find(nums2[st.top()]) != map.end()){
result[map[nums2[st.top()]]] = nums2[i];
}
st.pop();
}
st.push(i);
}
return result;
}
};
标签:58,top,元素,st,60,result,nums1,nums2
From: https://www.cnblogs.com/tazdingo/p/18102147