LC 739. 每日温度
题目链接:LC 739. 每日温度
思路:不是按着顺序去得到每天之后的更高温度,而是通过栈将未能得到更高温度的天保存下来,然后向后遍历,每次遍历的元素要和栈顶元素比较若遍历的元素温度高就移除栈顶元素,并且将栈顶元素对应的结果保存下来,直到栈顶元素的值比遍历的值大,再将遍历的值放入栈中。其中栈中的元素从栈底到栈顶始终保持递减的顺序。
代码:
class Solution {
public:
//暴力解法,会超时
// vector<int> dailyTemperatures(vector<int>& temperatures) {
// vector<int> result;
// for(int i=0; i<temperatures.size()-1;i++){
// int flag = 0;
// for(int j=i+1; j<temperatures.size(); j++){
// if(temperatures[i]<temperatures[j]){
// result.push_back(j-i);
// flag = 1;
// break;
// }
// }
// if(flag == 0)result.push_back(0);
// }
// result.push_back(0);
// return result;
// }
//单调栈解法
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> result(temperatures.size(), 0);
stack<int> st;//栈中存放的是数组下标
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[i]>temperatures[st.top()]){
result[st.top()] = i-st.top();
st.pop();
}
st.push(i);
}
}
return result;
}
};
LC 496.下一个更大元素 I
题目链接:LC 496.下一个更大元素 I
思路:首先要找到nums1元素与nums2元素对应的位置。本质上还是找nums2中每个元素的下一个更大元素,不过只保存nums1中元素,并且保存的顺序也按nums1来。那么可以给nums1设定map,每次nums2找到下一个更大元素的时候,就看nums1是否有该元素,若有该元素就保存结果。
代码:
class Solution {
public:
//暴力解法 ,可以运行,耗时多,内存消耗少
// 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]){
// int cur = j+1;
// while(cur<nums2.size()){
// if(nums2[j]<nums2[cur]){
// result[i] = nums2[cur];
// break;
// }
// cur++;
// }
// }
// }
// }
// return result;
// }
//单调栈解法
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
//首先需要知道nums1中的每个元素在nums2的位置,使用map
unordered_map<int, int> map;
for(int i=0; i<nums1.size(); i++){//先遍历nums1,可以通过值得到该值的位置
map[nums1[i]] = i;
}
vector<int> result(nums1.size(), -1);
stack<int> st;
st.push(0);//这个0表示的也是下标
for(int i=1; i<nums2.size(); i++){
if(nums2[i]<=nums2[st.top()]){
st.push(i);
}
else{
while(!st.empty() && nums2[i]>nums2[st.top()]){
if(map.find(nums2[st.top()])!=map.end()){
result[map[nums2[st.top()]]] = nums2[i];
}
st.pop();
}
st.push(i);
}
}
return result;
}
};