一天一大 leet(每日温度)难度:中等 DAY-11
时间:2022-07-25
本文章向大家介绍一天一大 leet(每日温度)难度:中等 DAY-11,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目(难度:简单):
根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
示例
输入: [73, 74, 75, 71, 69, 72, 76, 73]
输出: [1, 1, 4, 2, 1, 1, 0, 0]
提示
气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
抛砖引玉
先阐述下题目的意思:
遍历数组
返回数组中 A 之后项第一个大于 A 的第一个数字的索引
填充索引到新数组中 A 对应的索引位置
/**
* @param {number[]} T
* @return {number[]}
*/
var dailyTemperatures = function (T) {
var len = T.length
var _result = Array(len).fill(0)
for (var i = 0; i < len; i++) {
var item = T[i]
if (item < 100) {
for (var j = i + 1; j < len; j++) {
if (T[j] > item) {
_result[i] = j - i
break
}
}
}
}
return _result
}
官方答案
暴力
- 反向遍历温度列表。对于每个元素 T[i],在数组 next 中找到从 T[i] + 1 到 100 中每个温度第一次出现的下标, 将其中的最小下标记为 warmerIndex,则 warmerIndex 为下一次温度比当天高的下标。 如果 warmerIndex 不为无穷大,则 warmerIndex - i 即为下一次温度比当天高的等待天数,最后令 next[T[i]] = i。
- 为什么上述做法可以保证正确呢?因为遍历温度列表的方向是反向,当遍历到元素 T[i] 时, 只有 T[i] 后面的元素被访问过,即对于任意 t,当 next[t] 不为无穷大时,一定存在 j 使得 t 等于 T[j] 且 i < j。 又由于遍历到温度列表中的每个元素时都会更新数组 next 中的对应温度的元素值, 因此对于任意 t,当 next[t] 不为无穷大时,令 j = next[t],则 j 是满足 t 等于 T[j] 且 i < j 的最小下标
/**
* @param {number[]} T
* @return {number[]}
*/
var dailyTemperatures = function (T) {
var length = T.length
var ans = Array(length).fill(0)
var next = Array(101).fill(Number.MAX_VALUE)
for (var i = length - 1; i >= 0; --i) {
var warmerIndex = Number.MAX_VALUE
for (var t = T[i] + 1; t <= 100; ++t) {
if (next[t] < warmerIndex) {
warmerIndex = next[t]
}
}
if (warmerIndex < Number.MAX_VALUE) {
ans[i] = warmerIndex - i
}
next[T[i]] = i
}
return ans
}
单调栈
- 栈空的情况下,当前元素入栈
- 当前元素比栈顶大,则让小项出栈,栈顶更新,直到当前元素比栈顶小,停止出栈
- 此时的栈顶元素就是当前项右边的第一个比自己大的元素,计算距离并让当前项入栈
/**
* @param {number[]} T
* @return {number[]}
*/
var dailyTemperatures = function (T) {
const res = new Array(T.length).fill(0)
const stack = []
for (let i = T.length - 1; i >= 0; i--) {
while (stack.length && T[i] >= T[stack[stack.length - 1]]) {
stack.pop()
}
if (stack.length && T[i] < T[stack[stack.length - 1]]) {
res[i] = stack[stack.length - 1] - i
}
stack.push(i)
}
return res
}
高手在民间
- 遍历整个数组,如果栈不空,且当前数字大于栈顶元素,所以需要取出栈顶元素,由于当前数字大于栈顶元素的数字,而且一定是第一个大于栈顶元素的数,直接求出下标差就是二者的距离。
- 继续看新的栈顶元素,直到当前数字小于等于栈顶元素停止,然后将数字入栈,这样就可以一直保持递减栈,且每个数字和第一个大于它的数的距离也可以算出来。
/**
* @param {number[]} T
* @return {number[]}
*/
var dailyTemperatures = function (T) {
let res = new Array(T.length).fill(0)
let stack = []
for (let i = 0; i < T.length; i++) {
while (stack.length && T[i] > T[stack[stack.length - 1]]) {
let topIdx = stack.pop()
res[topIdx] = i - topIdx
}
stack.push(i)
}
return res
}
- 卡奇话爬虫使用方法以及下载地址
- flash读取XML 背景自动适应大小
- 记录一个发邮件的cs文件
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(56)-插件---单文件上传与easyui使用fancybox
- xml-rpc(2)-first demo_v2
- xml-rpc(1)-first demo
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(55)-工作流设计-表单布局
- 网站源文件被注入了iframe代码—ARP欺骗的木马病毒攻击
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--工作流演示截图
- 基于CPPN与GAN+VAE生成高分辨率图像
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(54)-工作流设计-所有流程监控
- (收藏)搭建.NET Framework 3.0开发环境 及SharePoint 2007/WSS 3环境
- WCF技术剖析之八:ClientBase<T>中对ChannelFactory<T>的缓存机制
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(48)-工作流设计-起草新申请
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 万恶的NPE差点让我半个月工资没了
- R语言非参数模型厘定保险费率:局部回归、广义相加模型GAM、样条回归
- 大白话java多线程,高手勿入
- R语言小数定律的保险业应用:泊松分布模拟索赔次数
- R语言中自编基尼系数的CART回归决策树的实现
- ArrayList的删除姿势你都掌握了吗
- sas神经网络:构建人工神经网络模型来识别垃圾邮件
- R语言多分类logistic逻辑回归模型在混合分布模拟单个风险损失值评估的应用
- 10分钟带你入门git到github
- 微服务[学成在线] day18:基于oauth2实现RBAC认证授权、微服务间认证实现
- 【TBase开源版测评】分布式事务全局一致性
- R语言进阶之主成分分析
- 二胖写参数校验的坎坷之路
- 图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正
- R语言时间序列数据指数平滑法分析交互式动态可视化