本文主要是介绍代码随想录训练营第五十八天| (单调栈)● 739. 每日温度 ● 496.下一个更大元素 I,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
739. 每日温度
今天正式开始单调栈,这是单调栈一篇扫盲题目,也是经典题。
大家可以读题,思考暴力的解法,然后在看单调栈的解法。 就能感受出单调栈的巧妙
代码随想录
这道题使用单调栈来实现,通过栈来存储已经遍历过的元素,用空间换时间,使用一次遍历即可完成。在栈中是递增来存储元素的,从栈顶到栈底的元素大小是递增排序的。每遍历到一个元素就要将元素存入栈中,当存入栈的元素大于当前栈顶的元素,就要将栈顶元素弹出,并计算温度天数的差值,重复执行直至当前元素小于栈顶元素。直至遍历完成。
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;}
496.下一个更大元素 I
本题和 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;}
这篇关于代码随想录训练营第五十八天| (单调栈)● 739. 每日温度 ● 496.下一个更大元素 I的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!