一.题目介绍
1.题目来源
链接:LeetCode
2.题目
给定一个整数数组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]
示例 3:
输入: temperatures = [30,60,90] 输出: [1,1,0]
提示:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100
二.具体实现
1.实现思路
按题目的要求是返回比前一日高的温度集合,如果没有则记为0,那怎么去比较就是本题的重点了,我的想法是使用栈来实现,利用栈的特点以天数作为栈元素,对栈内元素进行比较,与前一个元素相比是小于则直接进栈,是大于则进行比较,最终得到结果。
2.实现代码
1)自己的实现方式
public int[] dailyTemperatures(int[] temperatures) { //采用单调栈,栈ding的元素和栈内的元素比较,小于直接进栈,大于则作比较 //注意栈内存的是天数 Deque<Integer> deque = new ArrayDeque<>(); int[] res = new int[temperatures.length]; for (int i = 0; i < temperatures.length; i++) { while (!deque.isEmpty() && temperatures[deque.peek()] < temperatures[i]) { int idx = deque.pop(); res[idx] = i - idx; } deque.push(i); } return res; } 复制代码
2)题友的实现方式
针对每个温度值 向后进行依次搜索 ,找到比当前温度更高的值。其原理是从左到右除了最后一个数其他所有的数都遍历一次,最后一个数据对应的结果肯定是0,就不需要计算,遍历的时候,每个数都去向后数,直到找到比它大的数,数的次数就是对应输出的值。
代码:
3.运行结果
三.题后思考
在本题中使用栈作为媒介确实要比使用MAP好很多,而题友的想法更好,不用借助其他媒介,节省了使用空间,感觉自己还是很愚笨,在算法题上有先入为主的思想,比较容易吃亏,还是得多思考,换角度思考,不怎么做还能怎么做。