当前位置: 首页 > article >正文

算法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>


http://www.kler.cn/a/519502.html

相关文章:

  • 为什么在编程中cast有强制类型转换的意思?
  • 14-6-1C++STL的list
  • 豆包 MarsCode + 开源 = ?AI 助力开源社区新人成长
  • [操作系统] 进程地址空间管理
  • 讯飞绘镜(ai生成视频)技术浅析(二):大模型
  • Chameleon(变色龙) 跨平台编译C文件,并一次性生成多个平台的可执行文件
  • 小识Java死锁是否会造成CPU100%?
  • 16 分布式session和无状态的会话
  • 贪心算法(六)
  • 均值(信息学奥赛一本通-1060)
  • 【Linux系统】进程间通信一
  • Linux C openssl aes-128-cbc demo
  • Batch Normalization学习笔记
  • 77,【1】.[CISCN2019 华东南赛区]Web4
  • Java数据结构 (链表反转(LinkedList----Leetcode206))
  • Qt网络通信(TCP/UDP)
  • 运维实战---多种方式在Linux中部署并初始化MySQL
  • DeepSeek_R1论文翻译稿
  • RV1126画面质量五:Profile和编码等级讲解
  • 【北京大学 凸优化】Lec1 凸优化问题定义
  • Linux Futex学习笔记
  • 第 10 课 Python 内置函数
  • 在 Ubuntu22.04 上安装 Splunk
  • 2025年1月22日(什么是扫频)
  • vue router路由复用及刷新问题研究
  • 从 VJ 拥塞控制到 BBR:ACK 自时钟和 pacing