前言:
此刻大家对“笔试的算法题”都比较关注,姐妹们都需要分析一些“笔试的算法题”的相关资讯。那么小编也在网上收集了一些有关“笔试的算法题””的相关文章,希望兄弟们能喜欢,我们快快来了解一下吧!在这个系列的博客中,我们根据LeetCode官方给出的每个题目的出现频率,整理并收录了每个类别里高频出现的题目,从简单到中等再到困难,为你提供解题技巧和最佳实践。我们将介绍常见的算法思想,如贪心算法、动态规划、回溯算法等,希望能帮助你提高算法水平,成为你进入人工智能行业敲门砖。
739. 每日温度(难度4/频率3)
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2:
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
解题思路
通常在一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。
单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是只需要遍历一次,因此时间复杂度为O(n)。
使用单调栈主要有三个判断条件。
当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
把这三种情况分析清楚了,也就理解透彻了。
图解示例
以上述示例一举例,首先先将第一个遍历元素加入单调栈:
加入T[1] = 74,因为T[1] > T[0](当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),而我们要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右面第一个比T[0]大的元素是T[1]。
加入T[2],同理,T[1]弹出
加入T[3],T[3] < T[2] (当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况),加T[3]加入单调栈。
加入T[4],T[4] == T[3] (当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况),此时依然要加入栈,因为我们要求的是右面第一个大于本元素的位置!
加入T[5],T[5] > T[4] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[4]弹出,同时计算距离,更新result。
T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[3]继续弹出,同时计算距离,更新result。
直到发现T[5]小于T[st.top()],终止弹出,将T[5]加入单调栈。
加入T[6],同理,需要将栈里的T[5],T[2]弹出。
此时栈里只剩下了T[6],加入T[7], T[7] < T[6] 直接入栈,这就是最后的情况,result数组也更新完了。
注意最后发现没符合要求的,result[6] , result[7]没有做相应的更新。其实定义result数组的时候,就应该直接初始化为0,如果result没有更新,说明这个元素右面没有更大的了,也就是为0。
代码实现
class Solution: def dailyTemperatures(self, temperatures: List[int]) -> List[int]: answer = [0]*len(temperatures) stack = [0] for i in range(1,len(temperatures)): # 情况一和情况二 if temperatures[i]<=temperatures[stack[-1]]: stack.append(i) # 情况三 else: while len(stack) != 0 and temperatures[i]>temperatures[stack[-1]]: answer[stack[-1]]=i-stack[-1] stack.pop() stack.append(i) return answer
标签: #笔试的算法题 #贪心算法与动态规划算法的共同点 #算法面试经典100题及答案 #计算机栈的计算题