和一起做网店类似的网站,任何小说都能搜到的软件,网站做m版,抖音代运营方案范文第十章 单调栈part01
739. 每日温度
给定一个整数数组 temperatures #xff0c;表示每天的温度#xff0c;返回一个数组 answer #xff0c;其中 answer[i] 是指对于第 i 天#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高#xff0c;请在该位置用…第十章 单调栈part01
739. 每日温度
给定一个整数数组 temperatures 表示每天的温度返回一个数组 answer 其中 answer[i] 是指对于第 i 天下一个更高温度出现在几天后。如果气温在这之后都不会升高请在该位置用 0 来代替。
暴力法案例超时不能通过
class Solution {
public:vectorint dailyTemperatures(vectorint temperatures) {vectorint result(temperatures.size(),0);for(int i0;itemperatures.size();i){for(int ji1;jtemperatures.size();j){if(temperatures[i]temperatures[j]) {result[i]j-i;break;}}}return result;}
};
时间复杂度O(n^2)空间复杂度O(n)
使用单调栈解决
单调栈用于解决一维数组寻找任一个元素的右边或者左边第一个比自己大或小的位置。 class Solution {
public:vectorint dailyTemperatures(vectorint temperatures) {vectorint result(temperatures.size(),0);stackint st;st.push(0);for(int i1;itemperatures.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;}
};
时间复杂度O(n)空间复杂度O(n)
496. 下一个更大元素 I
nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。
给你两个 没有重复元素 的数组 nums1 和 nums2 下标从 0 开始计数其中nums1 是 nums2 的子集。
对于每个 0 i nums1.length 找出满足 nums1[i] nums2[j] 的下标 j 并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素那么本次查询的答案是 -1 。
返回一个长度为 nums1.length 的数组 ans 作为答案满足 ans[i] 是如上所述的 下一个更大元素 。
思路使用上一题的方法用单调栈求出nums2数组中下一个元素组成的数组nums2_res然后遍历nums1,用nums1中的元素去nums2_res中找到答案。感觉思路没有问题然后一直报错 执行出错 Line 172: Char 16: runtime error: reference binding to misaligned address 0xbebebebebebec0ba for type int, which requires 4 byte alignment (stl_deque.h) 0xbebebebebebec0ba: note: pointer points here memory cannot be printed SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c/11/bits/stl_deque.h:181:16 最后比对发现问题出在while(nums2[i]nums2[st.top()!st.empty())
使用连接两个条件时会首先对第一个条件进行判断第一个条件满足对第二个条件进行判断如不满足则不对第二个条件判断。所以在这里必须先执行st.empty()条件判断。调换顺序后ac
class Solution {
public:vectorint nextGreaterElement(vectorint nums1, vectorint nums2) {vectorint result(nums1.size(),-1);vectorint nums2_res(nums2.size(),-1);stackint st;st.push(0);for(int i1;inums2.size();i){while(!st.empty()nums2[i]nums2[st.top()]){nums2_res[st.top()]nums2[i];st.pop();}st.push(i);}unordered_mapint,int umap;for(int i0;inums2.size();i){umap[nums2[i]]i;}for(int i0;inums1.size();i){result[i]nums2_res[umap[nums1[i]]];}return result;}
};也可以直接在用单调栈求解时直接映射到nums1对应数组
class Solution {
public:vectorint nextGreaterElement(vectorint nums1, vectorint nums2) {stackint st;st.push(0);vectorint result(nums1.size(),-1);if(nums1.size()0) return result;unordered_mapint,int umap;for(int i0;inums1.size();i){umap[nums1[i]]i;}for(int i1;inums2.size();i){while(!st.empty()nums2[i]nums2[st.top()]){if(umap.count(nums2[st.top()])0){int indexumap[nums2[st.top()]];result[index]nums2[i];}st.pop();}st.push(i);}return result;}
};