今天正式开始单调栈,这是单调栈一篇扫盲题目,也是经典题。
大家可以读题,思考暴力的解法,然后在看单调栈的解法。?就能感受出单调栈的巧妙
这道题使用单调栈来实现,通过栈来存储已经遍历过的元素,用空间换时间,使用一次遍历即可完成。在栈中是递增来存储元素的,从栈顶到栈底的元素大小是递增排序的。每遍历到一个元素就要将元素存入栈中,当存入栈的元素大于当前栈顶的元素,就要将栈顶元素弹出,并计算温度天数的差值,重复执行直至当前元素小于栈顶元素。直至遍历完成。
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> result(temperatures.size(), 0);
for (int i = 0; i < temperatures.size(); i++) {
while (!st.empty() && temperatures[st.top()] < temperatures[i]) {
result[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
return result;
}
本题和?739.?每日温度?看似差不多,其实?有加了点难度。
这道题比上道题复杂了一点,有两个数组,nums1是nums2的子集,所以需要一个map来对nums1的元素进行映射,将nums1中的元素和下标存入map中,在nums遍历的过程中判断该元素在nums1中是否存在,同时要根据map的key和value来找到nums2中的元素再nums1中的下标。
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
//初始化
stack<int> st;
vector<int> result(nums1.size(), -1);
if (nums1.size() == 0) return result;
//使用map映射元素
unordered_map<int, int> map;
for (int i = 0; i < nums1.size(); i++) {
map[nums1[i]] = i;
}
//遍历元素
for (int i = 0; i < nums2.size(); i++) {
while (!st.empty() && nums2[st.top()] < nums2[i]) {
if (map.find(nums2[st.top()]) != map.end()) {
int index = map[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标
result[index] = nums2[i];
}
st.pop();
}
st.push(i);
}
return result;
}