文章目录

  • 题目
  • 题解1(蛮力法)
    • 代码实现
    • 复杂度分析
  • 题解2(栈方法)
    • 代码实现
    • 复杂度分析

题目

这是LeetCode上的 [739,每日温度],难度为 [中等]

请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 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(蛮力法)

我们可以在遍历每一天的温度时,让当前天的温度与当前天的温度后面的每一天的温度作比较,直到找到第一个最高温度的天数

代码实现

class Solution {public int[] dailyTemperatures(int[] temperatures) {// 创建一个数组,存放每一天需要等多少天才能有第一个最高温度int[] days = new int[temperatures.length];// 遍历每一天的温度,遍历过程中让当前天的温度与当前天的温度后面的每个天的温度作比较for (int i = 0; i < temperatures.length; i++) {for (int j = i + 1; j < temperatures.length; j++) {// 若当前天的温度小于当前天的温度后面的某一天的温度,则找到了当前天的温度第一个最高温度的天数if (temperatures[i] < temperatures[j]) {// 第一个最高温度的天数减去当前天的温度的天数即为当前天需要等的天数days[i] = j - i;break;}}}return days;}
}

复杂度分析

假设输入的数组的长度为n

时间复杂度

在遍历每一天时,需要遍历当前天后面的每一天作比较,故时间复杂度为O(n2

空间复杂度

需要声明一个数组来记录每一天需要等多少天才有第一个最高温度,故空间复杂度为O(n)

题解2(栈方法)

蛮力法的缺点就是在遍历每一天温度时,需要把当前天的温度与当前天的温度后面的每个天的温度进行比较找出当前天第一个最高温度,即O(n2)

那么可不可以只比较两两相邻的天的温度找出当天的第一个最高的温度呢?如果可以那么时间复杂度就降到O(n)了

例如我们可以在遍历每一天的温度时借助一个辅助容器来比较两两相邻的天的温度

  1. 若当前天的温度没有前一天的温度,例如第一次循环时当前天的温度是第一天的温度,故没有前一天的温度,由于不知道后面还有没有比他更高的温度,则把当前天的温度的下标(当前遍历的下标)放进一个容器中

  2. 若当前天的温度有前一天的温度,则把当前天的温度和前一天的温度(也就是已经保存容器中的温度的 下标,通过下标就可以知道温度)进行比较

    • 若当前天的温度小于前一天的温度,则当前天的温度不是前一天的温度的第一个最高温度,因此可以把当前天的温度的下标放进一个容器中,因为不知道后面还有没有比他更高的温度
    • 若当前天的温度大于前一天的温度,则当前天的温度是前一天的第一个最高温度,因此就找到了前一天的第一个最高温度,把前一天的温度取出容器,即当前天的温度下标减去前一天温度下标就知道前一天需要等多少天才有第一个最高温度,之后让当前天重复最开始的1,2步

需要注意的是,前一天指的是相对的,即容器最后存放的天数为前一天,而不是实际的前一天

综上分析,此容器需要遵循先进后出的特点,因此可以使用栈来作为容器

代码实现

class Solution {public int[] dailyTemperatures(int[] temperatures) {// 创建一个栈,来存放遍历每一天的温度时当前天的前面每一天的天数Deque<Integer> stack = new LinkedList<>();// 创建一个数组,存放每一天需要等多少天才能有第一个最高温度int[] days = new int[temperatures.length];// 遍历每一天的温度for (int i = 0; i < temperatures.length; i++) {/* 当前天有前一天(即栈不为空),且当前天的温度大于前一天的温度,则说明找到前一天的第一个最高温度,前一天的温度出栈,值为前一天的天数当前天的天数(遍历过程的索引)减去前一天的天数,即可算出前一天需要等多少天才有第一个最高温度执行下一次迭代,判读是否满足循环条件*/while (!stack.isEmpty() && temperatures[stack.peek()] < temperatures[i]) {int pre = stack.pop();days[pre ] = i - pre ;}/* 若当前天没有前一天*(栈为空)或当前天的温度小于前一天的的温度,都让当前天进栈* 因为不知道后面有没有比它更高的温度*/stack.push(i);}return days;}
}

复杂度分析

假设输入的数组的长度为n

时间复杂度

虽然上面代码使用了一个嵌套循环,当内层循环并不是每次都执行的,这是因为每一天的天数进栈,出栈各一次,即在遍历每一天时,每一天的天数最多有一次进栈和出栈操作。故内层循环的时间复杂度可以认为O(1),外层需要遍历每一天,故总的时间复杂度为O(n)

空间复杂度

需要声明一个数组来记录每一天需要等多少天才有第一个最高温度,空间复杂度为O(n,)需要一个栈来存放遍历过程中当前天前面的每一天的天数(下标),空间复杂度为O(n),故总的空间复杂度为2O(n) = O(n)

Java每日一题——>739. 每日温度(蛮力法,栈方法)相关推荐

  1. [每日一题] 0. 每日一题题解汇总

    每日一题 锻炼编程能力,每日尽量至少更新一道算法编程题,其各题目代码已经同步到我的GitHub的Everyday_Coding仓库中:Y-puyu的GitHub仓库,博客内主要更新学习C/C++.Li ...

  2. 每日一题,每日一练。11车的可用捕获量(半夜两点在棋盘上左右横跳),

    在一个 8 x 8 的棋盘上,有一个白色车(rook).也可能有空方块,白色的象(bishop)和黑色的卒(pawn).它们分别以字符 "R",".",&quo ...

  3. 每日写题分享--包含min函数的栈/双栈实现

    题目描述: 题目链接:包含min函数的栈 思路: 1.建立两个栈,一个是存储所有数据并可以正常实现push,pop,peek等函数的数据栈stack1,一个是存储stack1非严格降序的辅助栈stac ...

  4. 【Java每日一题】20161012

    package Oct2016; public class Ques1012 { public static void main(String[] args) { System.out.println ...

  5. JS每日一题: 小程序页面之间如何通信?

    20190227 小程序页面之间如何通信? 首先将通信的模型列举出来, 分为以下几种 兄弟页面间通信 父路径页面向子路径页面通信 子路径页面向父路径页面通信 通信的方式 localStorage 本地 ...

  6. JS每日一题:Vue中的diff算法?

    20190125 Vue中的diff算法? 概念: diff算法是一种优化手段,将前后两个模块进行差异对比,修补(更新)差异的过程叫做patch(打补丁) 为什么vue,react这些框架中都会有di ...

  7. JS每日一题:vue中keepalive怎么理解?

    20190212问 vue中keepalive怎么理解? 说在前面: keep-alive是vue源码中实现的一个组件, 感兴趣的可以研究源码 https://github.com/vuejs/vue ...

  8. 每日一题(易错):哪些REPEAT_INTERVAL参数能够实现每30分钟运行job

    你希望每30分钟运行job.下列哪些REPEAT_INTERVAL参数能够实现这一目标? A.'freq=minutely;byminute=30' B.'freq=hourly;interval=1 ...

  9. 每日一题丨以下哪个SQL查询的结果是2006-01-01 00:00:00

    以下哪个SQL查询的结果是2006-01-01 00:00:00 A.select round(date'2006-01-16','mm') from dual; B.select round(dat ...

  10. 每日一题(易错):这条SQL语句,有什么作用?

    以下在数据库中执行的语句,有什么作用:GRANT update ON enmotech TO eygle WITH GRANT OPTION; A.用户eygle被授予在这个对象上的所有权限; B.一 ...

最新文章

  1. js去el的map_转:el表达式获取map对象的内容 js中使用el表达式 js 中使用jstl 实现 session.removeattribute...
  2. linux 重定向类型 超级块 i节点
  3. Oracle database 11g 安装 - 配置企业管理器database control失败
  4. 《孤岛惊魂5》游戏中的地形渲染技术-网格生成
  5. M2 Planning Day3
  6. python赋值语句的一般格式为_[零基础学Python]赋值,简单也不简单
  7. .net连接MYSQL数据库方法一
  8. Java8新特性(Arrays)
  9. 大师兄科研网_挑战杯经验分享会与你话科研
  10. 【2012.1.24更新】不要再在网上搜索eclipse的汉化包了!
  11. oracle pck文件是什么,PCK文件扩展名 - 什么是.pck以及如何打开? - ReviverSoft
  12. 3D Vision、SLAM求职宝典 | 图像处理篇(C)
  13. koa2 mysql sequelize_[转]使用nodejs-koa2-mysql-sequelize-jwt 实现项目api接口
  14. Java、储物柜难题
  15. dos2unix 解决脚本执行过程中的莫名错误 “not found”
  16. docker:error pulling image configuration
  17. EHIGH恒高:大话UWB技术之TDOA与TOF两种技术方案对比
  18. android 对话框 美化,Android修改Dialog样式
  19. 计算机配件对比,如何挑选配件,组装电脑?
  20. 无刷直流电机simulink仿真

热门文章

  1. 《计算机网络 自顶向下》第二章==应用层==随堂笔记
  2. ASPECT RATIO
  3. quartz mysql 表 集群配置_Quartz集群配置
  4. 小程序 WeUI导入时导入失败,出现Component is not found in path 的错误
  5. Facebook攻略--注册流程
  6. Linux系统无网络安装nginx
  7. 徐姗姗 20190905-3 命令行和控制台编程
  8. c语言一个数平方表示,C语言 - 利用 汇编思想 写一个数的平方
  9. Java8 Lambda表达式的特快处理流Stream快速入门
  10. python迭代器与生成器答案,彻底搞懂python 迭代器和生成器