算法12(力扣739)-每日温度
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 = [];
// 初始化数组初始值为0
let 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 = [];
// 初始化数组初始值为0
let 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>