1、问题
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中
answer[i] 是指对于第 i
天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0
来代替。
2、示例
(1)
输入: temperatures = [73,74,75,71,69,72,76,73] <br />
输出: [1,1,4,2,1,1,0,0]
(2)
输入: temperatures = [30,40,50,60] <br />
输出: [1,1,1,0]
3、实现思路
(1)理解题意
(2)思路:
建立空数组用于存储,循环遍历,不符合条件的将索引压入栈(以便后面有符合条件的弹出,作为存储最终结果的索引),符合条件的,将栈顶元素(也就是需要替换结果的元素索引)弹出,用其作为最终结果的替换索引
t是temperatures数组,s是stk栈
4、具体步骤
(1) 空栈,存储数组 temperatures 的索引,res存储最终结果(先进行初始化,实现“
气温在这之后都不会升高,请在该位置用 0 来代替”)
(2)进入循环
1)将不符合条件的数组压入栈,符合条件的弹出,然后将弹出元素的索引用于存储最终结果的索引
2)条件怎么设?
①空栈stk不进入循环,因为没有可以进行比较的索引
②比较循环项i(最新项)和之前项进行比较,如果他的前一项刚好比他小(即后一个气温更高,将前一项的索引弹出,将这个索引用于更新最终结果res的值(相差几天(用该次循环i-弹出索引preIndex))),如果不比他小,将新的索引压入栈stk,然后再进行比较
(3)返回最终结果res
5、完整代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>每日温度</title></head><body><p>给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中answer[i] 是指对于第 i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0来代替。</p><p>输入: temperatures = [73,74,75,71,69,72,76,73] <br />输出: [1,1,4,2,1,1,0,0]</p><p>输入: temperatures = [30,40,50,60] <br />输出: [1,1,1,0]</p><p>实现思路:遍历数组,通过indexOf获取当前索引,然后将当前值和索引传入函数,进行比较</p><script>let temperatures = [73, 74, 75, 71, 69, 72, 76, 73];dailyTemperatures(temperatures);function dailyTemperatures(temperatures) {// console.log(temperatures);// 空栈,存储数组 temperatures 的索引let stk = [];// 初始化数组初始值为0let res = new Array(temperatures.length).fill(0);for (let i = 0; i < temperatures.length; i++) {// 当栈不为空且当前温度 temperatures[i] 大于栈顶索引所指向的温度 temperatures[stk[stk.length - 1]] 时,进入循环while (stk.length > 0 &&temperatures[i] > temperatures[stk[stk.length - 1]]) {// 被弹出的元素索引let preIndex = stk.pop();// 相差值res[preIndex] = i - preIndex;}stk.push(i);}// console.log(res);return res;}</script></body>
</html>
6、力扣通过代码
var dailyTemperatures = function(temperatures) {// console.log(temperatures);// 空栈,存储数组 temperatures 的索引let stk = [];// 初始化数组初始值为0let res = new Array(temperatures.length).fill(0);for (let i = 0; i < temperatures.length; i++) {// 当栈不为空且当前温度 temperatures[i] 大于栈顶索引所指向的温度 temperatures[stk[stk.length - 1]] 时,进入循环while (stk.length > 0 &&temperatures[i] > temperatures[stk[stk.length - 1]]) {// 被弹出的元素索引let preIndex = stk.pop();// 相差值res[preIndex] = i - preIndex;}stk.push(i);}// console.log(res);return res;
};
7、超时代码(循环遍历其中各项,通过索引和当前值在内循环中变量比较,获取最终值,可以通过测试用例,但提交会超时,时间复杂度为O(n**2))
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>每日温度</title></head><body><p>给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中answer[i] 是指对于第 i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0来代替。</p><p>输入: temperatures = [73,74,75,71,69,72,76,73] <br />输出: [1,1,4,2,1,1,0,0]</p><p>输入: temperatures = [30,40,50,60] <br />输出: [1,1,1,0]</p><p>实现思路:遍历数组,通过indexOf获取当前索引,然后将当前值和索引传入函数,进行比较</p><script>let temperatures = [73, 74, 75, 71, 69, 72, 76, 73];dailyTemperatures(temperatures);function dailyTemperatures(temperatures){}function dailyTemperatures(temperatures) {// console.log(temperatures);let arr = [];for (let i = 0; i < temperatures.length; i++) {let cur = temperatures[i];let res = checkIt(i, cur);// console.log(res);arr.push(res);}console.log(arr);function checkIt(index, cur) {for (let j = index + 1; j < temperatures.length; j++) {if (cur < temperatures[j]) {let res = j - index;return res;}}return 0;}}</script></body>
</html>