739 用stack来写 stack里面发index 不要放数值
重点在于 1.填写result数组不需要按顺序填写 根据index就可以 2.遍历的值比top小的话就放入stack 这样stack里面是一个递减数组 遍历的值只需和top比 如果比他大就pop 一直到把stack里面比新加入的值小的都pop完为止 这样stack里面还是递减数组
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> result(temperatures.size(), 0);
stack<int> stack;
stack.push(0);//push in the first index in temperatures array
for (int i=1; i<temperatures.size(); i++) {
if (temperatures[i]<=temperatures[stack.top()]) stack.push(i);
else {
while (!stack.empty() && temperatures[i]>temperatures[stack.top()]) {
result[stack.top()]=i-stack.top();
stack.pop();
}
stack.push(i);
}
}
return result;
}
};
496 这道题写了超久 很容易很容易有小bug
思路上还是遍历nums2用单调栈来找出每个元素对应的下一个更大的值是几 但填入result vector的时候不能根据栈里面(nums2的下标)来填 而应该根据nums2里面的值找他在nums1里面的下标(此处用map来找) 根据这个下标来填写下一个更大的值就是最后要的result vector了
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> umap;
for (int i=0; i<nums1.size(); i++) {
umap[nums1[i]]=i;
}
stack<int> stack;
stack.push(0);
vector<int> result(nums1.size(), -1);
for (int i=1; i<nums2.size(); i++) {
if (nums2[i]<=nums2[stack.top()]) stack.push(i);
else {
while (!stack.empty() && nums2[i]>nums2[stack.top()]) {
if (umap.find(nums2[stack.top()])!=umap.end()) {
result[umap[nums2[stack.top()]]]=nums2[i];
}
stack.pop();
}
stack.push(i);
}
}
return result;
}
};