当前位置:网站首页>tag单调栈-单调栈预备知识-lt.739. 每日温度
tag单调栈-单调栈预备知识-lt.739. 每日温度
2022-08-03 04:55:00 【菜菜的大数据开发之路】
lt.739. 每日温度
[案例需求]
[思路分析一, 双重for循环遍历]
/** * 最简单莫过于双重循环,笔试时至少不会丢分 * 时间复杂度:O(n^2) * 空间复杂度:O(n) */
//外层循环是一次遍历给定数组, 内层循环是不断的寻找比外层循环此时遍历到的元素大的数,
//并用res持续的记录下最大的index差值
public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
for (int i = 0; i < T.length - 1; i++) {
for (int j = i + 1; j < T.length; j++) {
if (T[j] > T[i]) {
res[i] = j - i;
break;
}
}
}
return res;
}
[思路分析二, 单调栈简单原理]
通常是
一维数组, 要寻找一个元素的右边或者左边第一个比自己大或者小的元素的位置, 此时我们就可以想到用单调栈
。
- 本题就是找到一个元素右边第一个比自己大的元素, 所以可以用单调栈。
那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢?
单调栈的本质是
空间换时间, 因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素, 优点是只需要遍历一次。
[单调栈的使用]
- 使用单调栈首先明确:
- 单调栈里存放的元素是什么?
单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。
- 单调栈里元素是递增还是递减的?
从栈顶到栈底的顺序
- 本题, 我们要使用递增循序(再强调一下是指从栈顶到栈底的顺序),因为只有递增的时候,往栈中加入一个元素i,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i (curreentIndex, 即当前for循环遍历到的数的索引为i)。
[具体思路 + 代码实现]
- 维护一个存储下标的单调栈, 从栈底到栈顶的下标对应的温度列表中的温度依次递减, 如果一个下标在单调栈中, 则表示尚未找到下一次温度更高的下标。
- 正向遍历温度列表, 对于温度列表中的每个元素 T[i], 如果栈为空, 则直接将i进栈, 如果栈不为空, 则比较栈顶元素preIndex对应温度T[preIndex]和当前温度T[i], 如果T[i] > T[preIndex], 则将preInndex移除, 并将preIndex对应的天数赋为i - preIndex, 重复上述操作, 直到栈为空, 或者栈顶元素对应的温度小于等于当前温度, 然后将i出栈.
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
//维护递减栈,后入栈的元素总比栈顶元素小。
//比对当前元素与栈顶元素的大小
//若当前元素 < 栈顶元素:入栈
/若当前元素 > 栈顶元素:弹出栈顶元素,记录两者下标差值即为所求天数
//这里用栈记录的是 T 的下标。
Deque<Integer> stack = new LinkedList<>();
int len = temperatures.length;
int[] res = new int[len];
int index = 0;
for(int i = 0; i < len; i++){
int temperature = temperatures[i];
//当前元素 > 栈顶index的元素
//弹出preIndex, 记录preIndex与当前元素i的index差值, 更新到res[preIndex]
while(!stack.isEmpty() && temperature > temperatures[stack.peek()]){
int preIndex = stack.pop();
System.out.println("i为: " + preIndex);
//System.out.println("preIndex为: " + preIndex);
res[preIndex] = i - preIndex;
System.out.println(Arrays.toString(res));
}
//当前元素 <= 栈顶index的元素
//入栈当前元素
stack.push(i);
}
return res;
}
}
边栏推荐
- 建立树形结构
- Shell conditional statement judgment
- 接口测试 Mock 实战(二) | 结合 jq 完成批量化的手工 Mock
- Alienware上线首个数字时装AR试穿体验
- 2022 Henan Mengxin League Game (4): Zhengzhou University of Light Industry E - Sleep Well
- 如何利用 Flutter 实现炫酷的 3D 卡片和帅气的 360° 展示效果
- 设计模式——组合模式、享元模式(Integer缓存)(结构型模式)
- 【生物素叠氮化物|cas:908007-17-0】价格_厂家
- 社交电商如何做粉丝运营?云平台怎么选择商业模式?
- Create a tree structure
猜你喜欢
[Harmony OS] [ArkUI] ets development graphics and animation drawing
10.预测房价:回归问题
typescript47-函数之间的类型兼容性
【Harmony OS】【ARK UI】ets use startAbility or startAbilityForResult to invoke Ability
Jmeter 模拟多用户登录的两种方法
UV 裂解的生物素-PEG2-叠氮|CAS:1192802-98-4生物素接头
接口测试框架实战 | 流程封装与基于加密接口的测试用例设计
Modified BiotinDIAZO-Biotin-PEG3-DBCO|diazo-biotin-tripolyethylene glycol-diphenylcyclooctyne
Interface test practice | Detailed explanation of the difference between GET / POST requests
Shell条件语句判断
随机推荐
Kotlin-Flow common encapsulation class: the use of StateFlow
GIS数据漫谈(五)— 地理坐标系统
VR全景展打造专属元宇宙观展空间
Create a tree structure
5.回顾简单的神经网络
Interface Test Framework Practice (4) | Get Schema Assertion
How to prepare for the test interface test data
Peptides mediated PEG DSPE of phospholipids, targeted functional materials - PEG - RGD/TAT/NGR/APRPG
索引创建、删除与使用
获取Ip工具类
Coordinate knowledge in digital twin campus scenarios
GIS数据漫谈(六)— 投影坐标系统
建立树形结构
[Developers must see] [push kit] Collection of typical problems of push service service 2
接口管理工具YApi怎么用?颜值高、易管理、超好用
2022/08/02 Study Notes (day22) Multithreading
8.电影评论分类:二分类问题
MySQL 入门:Case 语句很好用
【Harmony OS】【ARK UI】轻量级数据存储
常见荧光染料修饰多种基团及其激发和发射波长数据一览数据