单调栈:739. 每日温度,496. 下一个更大的元素
739. 每日温度
暴力解法
思路:
通过两个循环来实现双指针,i 指针指向当前判断第几天,j 向后找,找到温度比第 i 天高的天数,那 j - i 就代表了当前隔了几天。
下述代码时间复杂度O(n^2),会出现超时的情况。
Code
class Solution(object):def dailyTemperatures(self, temperatures):""":type temperatures: List[int]:rtype: List[int]"""## 暴力做法是什么?两个循环(定位两个位置,left指向第几天数, right指向温度比当前left高的第几天数,二者相减就知道隔了几天)length = len(temperatures)answer = [0] * lengthfor i in range(length):for j in range(i+1, length):if temperatures[j] > temperatures[i]:answer[i] = j - ibreakelse:continuereturn answer
单调栈解法
思路:
- 用一个栈来存储遍历过的顺序。
- 用一个result数组来记录对比结果。
根据题目要求的顺序对数组进行遍历(这道题目要求是从左到右),并将元素的对应下标推入栈中,下个元素来的时候,只需要与栈顶对比大小,比栈顶元素大(题目要求是找到右边比左边大的)的话就将 当前元素下标 - 栈顶元素 来得到 nums[栈顶元素] 与 nums[当前元素下标] 的距离。
栈顶一定是后进的,如果比栈顶元素小则推入栈中;比栈顶大的话就将栈顶退出,并对result[栈顶元素] 进行赋值,来得到栈顶元素与当前元素的距离。随后继续比较,重复这个流程,直到遍历完毕。遍历完毕后,栈里面还有元素怎么办,此时表示在右边找不到比nums[ 栈内元素 ] 大的值了,那其实就是result[栈内元素] = 0,可以对result数组可以初始化为0,这样就不用额外操作了
这个栈是单调递增栈,递增的逻辑体现在栈顶的判断逻辑。如果是小于就推出的话,则是单调递减的逻辑。(顺序:从左到右)
重点强调 栈 存储的是 遍历顺序,即数组的下标。对比大小的逻辑 体现在栈顶,通过nums[当前元素下标]和nums[栈顶元素]判断,result数组来存储两个元素之间的距离。
整个流程图可以参考:代码随想录
Code
class Solution(object):def dailyTemperatures(self, temperatures):""":type temperatures: List[int]:rtype: List[int]"""length = len(temperatures)result = [0] * lengthstack = [0] ## 先将第一个元素下标存到栈中,后面遍历就从下一个元素下标开始遍历for i in range(1, length):# if len(stack) == 0: ## 可以缩减;与后面的情况进行合并# stack.append(i)# continuewhile len(stack) > 0: ## 栈内有元素## stack[-1] 表示栈顶。要清楚你定义的是个数组,只不过是拿数组来模拟成栈if temperatures[i] > temperatures[stack[-1]]: top = stack.pop() ## 栈顶推出result[top] = i - topelse:# stack.append(i) ## 必须放到循环外放,放到这里会存在一个情况,如果栈内只有两个元素;## 当元素2 > 元素1时,此时if成立,else不会执行,元素1弹出后栈变为空栈。如果放到这里进行推栈操作## 的话,会导致元素2没有被推入栈中。breakstack.append(i) ## 包含了两种情况。1:栈内没有元素,此时推入栈。2. 比栈顶元素小,此时推入栈return result
在代码上需要注意栈的底层数据结构是一个数组,因此仍然可以通过数组的操作来获得栈顶元素stack[-1],而为什么这个数组可以实现成栈,是因为pop()是右边出,append()是右边进,因此单向进出元素的数组就成为了栈。
496. 下一个更大的元素
理解题意:
- 在739.每日温度中,比当前数字x的下一个更大元素是在同一个数组中x的右边进行判断
- 这道题是变成了从nums2中进行判断。
- 如果在nums2中没找到比x更大的元素,输出-1
- 如果在nums2中找到和x相等的元素,此时就从该相等的元素这个位置,往右边查找来得到比当前元素大的下一个元素的下标
- 如果在nums2中找到和x相等的元素,但x后面没有更大的元素,输出-1