739. 每日温度
参考
思路1: 暴力解法
思路2: 单调栈
使用场合: 寻找任一个元素的右边或者左边第一个比自己大或者小的元素位置, 存放的是遍历过的元素
记忆:
单调栈是对遍历过的元素做记录, 一般是对栈顶的元素 nums[mystack.top()] 做赋值操作的
如果想找到右边的元素大于左边, 则需要大的元素沉底 (如 7 3 5 9 1, 7的结果是9)
单调栈存储的是索引号
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> mystack;
vector<int> res(temperatures.size());
mystack.push(0);
for (int i = 1; i < temperatures.size(); i++) {
while (mystack.empty() != true && temperatures[i] > temperatures[mystack.top()]) {
res[mystack.top()] = i - mystack.top();
mystack.pop();
}
mystack.push(i);
}
return res;
}
};
496.下一个更大元素 I
使用map映射索引号
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> mymap;
for (int i = 0; i < nums1.size(); i++) {
mymap[nums1[i]] = i;
}
stack<int> mystack;
vector<int> res(nums1.size(), -1);
mystack.push(0);
for (int i = 1; i < nums2.size(); i++) {
if (nums2[mystack.top()] >= nums2[i]) {
mystack.push(i);//大的沉底
} else {
while (!mystack.empty() && nums2[mystack.top()] < nums2[i]) {
if (mymap.find(nums2[mystack.top()]) != mymap.end()) {
int index = mymap[nums2[mystack.top()]];
res[index] = nums2[i];
}
mystack.pop();
}
mystack.push(i);
}
}
return res;
}
};
503.下一个更大元素II
环形数组的处理方式: 1.nums拼接 2.遍历nums.size() * 2
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int> res(nums.size(), -1);
stack<int> mystack;
mystack.push(0);
for (int i = 1; i < 2 * nums.size(); i++) {
if (nums[i % nums.size()] <= nums[mystack.top() % nums.size()]) {
mystack.push(i);
} else {
while (!mystack.empty() && nums[i % nums.size()] > nums[mystack.top() % nums.size()]) {
res[mystack.top() % nums.size()] = nums[i % nums.size()];
mystack.pop();
}
mystack.push(i);
}
}
return res;
}
};