LeetCode 热题 100_每日温度(72_739_中等_C++)(栈)(暴力破解;栈(从左到右);栈(从右到左))

LeetCode 热题 100_每日温度(72_739)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(暴力破解法(双重循环)):
        • 思路二(栈:从左到右):
        • 思路三(栈:从右到左):
      • 代码实现
        • 代码实现(思路一(暴力破解法(双重循环))):
        • 代码实现(思路二(栈:从左到右)):
        • 代码实现(思路三(栈:从右到左)):
        • 以思路二为例进行调试

题目描述:

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 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、我们需要遍历每一天的温度,并找到之后的某一天,找到第一个比当前温度大的温度。每次找到一个比当前温度大的温度时,计算两者的天数差,并保存这个结果。如果遍历完整个数组没有找到比当前温度大的温度,那么该位置的 ans[i] 就是 0。

2、具体思路如下:
① 我们用一个 ans 数组来保存每一天的答案,初始化为 0。
② 外层循环遍历每一天的温度。
③ 内层循环从当前天的后一天开始,向后查找温度较大的那一天。如果找到,则记录下两天的天数差。
④ 如果没有找到比当前温度更高的温度,ans[i] 保持为 0。

3、复杂度分析:
① 时间复杂度:O(n2),使用了双重循环。
② 空间复杂度:O(1),除存储的答案数组外,使用常数个空间。

思路二(栈:从左到右):

1、解题思路

  • 我们从左往右遍历温度数组 temperatures,并通过栈保存尚未找到更高温度的元素的下标。
  • 每次遇到一个比栈顶元素大的温度时,就意味着找到了栈顶下标对应的温度之后的第一个更高温度。此时就可以计算出天数差并将栈顶元素出栈。
  • 如果当前温度比栈顶元素的温度小或相等,则将当前下标压入栈中。

2、具体思路如下:
① 首先将答案数组赋值为0,从左向右遍历元素。
② 当前栈非空 且 当前元素大于栈顶元素,则栈顶元素出栈,并计算出天数差(直至此元素不大于栈顶元素,或栈为空)。将当前元素进栈。
③ 其余两种情况:栈空则直接入栈,当前元素小于等于栈顶元素直接入栈。

3、复杂度分析
① 时间复杂度:O(n),其中 n 是数组中的元素数量。因只遍历一遍数组。
② 空间复杂度:O(n),最坏的情况下所有的元素都需进栈。

思路三(栈:从右到左):

1、解题思路

  • 我们从右往左遍历温度数组 temperatures,并通过栈保存还未遍历的左侧结点可能的更高温度。
  • 当前栈非空 且 当前元素大于等于栈顶元素,则栈顶元素出栈(直至此元素小于栈顶元素,或栈为空)。将当前元素进栈。
  • 其余两种情况:栈空则直接入栈。当前元素小于栈顶元素计算天数差并将元素入栈。

2、具体思路如下:
① 首先将答案数组赋值为0,从右向左遍历元素。
② 当前栈非空 且 当前元素大于等于栈顶元素,则栈顶元素出栈(直至此元素小于栈顶元素,或栈为空)。将当前元素进栈。
③ 其余两种情况:栈空则直接入栈。当前元素小于栈顶元素直接入栈并计算天数差。

3、复杂度分析
① 时间复杂度:O(n),其中 n 是数组中的元素数量。因只遍历一遍数组。
② 空间复杂度:O(n),最坏的情况下所有的元素都需进栈(方法三较方法二而言,栈中没有存储相同的元素)。

代码实现

代码实现(思路一(暴力破解法(双重循环))):
class Solution1 {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {// 初始化一个大小为 temperatures.size() 的结果数组 ans,默认值为 0vector<int> ans(temperatures.size(), 0);// 遍历每一天的温度for (int i = 0; i < temperatures.size(); i++) {// 从当前天的后一天开始遍历for (int j = i + 1; j < temperatures.size(); j++) {// 如果找到了比当前天温度大的那一天if (temperatures[j] > temperatures[i]) {// 记录两天的天数差ans[i] = j - i;// 跳出内层循环,因为已经找到了第一个比当前温度大的温度break;}}}// 返回最终的结果数组return ans;}
};
代码实现(思路二(栈:从左到右)):
class Solution2 {
public:// dailyTemperatures函数接受一个整数数组temperatures,返回一个与该数组长度相同的结果数组。// 结果数组的每个元素表示从当前天开始,经过多少天温度才会比当前温度高。vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> stk;  // 栈,用来存储温度数组的索引。vector<int> ans(temperatures.size(), 0);  // 结果数组,初始值为0,大小与输入数组相同。// 遍历温度数组for (int i = 0; i < temperatures.size(); i++) {// 如果栈不为空且当前温度大于栈顶所对应的温度// 说明找到了栈顶温度的下一个较高温度,记录间隔天数并弹出栈顶元素。while (!stk.empty() && temperatures[i] > temperatures[stk.top()]) {ans[stk.top()] = i - stk.top();  // 计算天数差,更新结果数组。stk.pop();  // 弹出栈顶元素。}stk.push(i);  // 当前天的索引入栈,待后续天数比较。}return ans;  // 返回结果数组,包含每一天的等待天数。}
};
代码实现(思路三(栈:从右到左)):
class Solution3 {
public:// dailyTemperatures函数接受一个整数数组temperatures,返回一个与该数组长度相同的结果数组。// 结果数组的每个元素表示从当前天开始,经过多少天温度才会比当前温度高。vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> stk;  // 栈,用来存储温度数组的索引。vector<int> ans(temperatures.size(), 0);  // 结果数组,初始值为0,大小与输入数组相同。// 从后往前遍历温度数组for (int i = temperatures.size() - 1; i >= 0; i--) {// 如果栈不为空且当前温度大于等于栈顶所对应的温度// 说明当前天的温度不能找到比它更高的温度,因此需要弹出栈顶元素。while (!stk.empty() && temperatures[i] >= temperatures[stk.top()]) {stk.pop();  // 弹出栈顶元素,因为当前温度比栈顶的温度要大或者相等,找不到更高的温度。}// 如果栈不为空,说明栈顶索引对应的温度大于当前温度// 那么栈顶索引对应的温度就是当前温度的下一个较高温度。if (!stk.empty()) {ans[i] = stk.top() - i;  // 计算天数差,更新结果数组。}// 将当前天的索引入栈,等待后续天数的比较。stk.push(i);}return ans;  // 返回结果数组,包含每一天的等待天数。}
};
以思路二为例进行调试
#include<iostream>
#include <vector>
#include<stack>
using namespace std;class Solution2 {
public:// dailyTemperatures函数接受一个整数数组temperatures,返回一个与该数组长度相同的结果数组。// 结果数组的每个元素表示从当前天开始,经过多少天温度才会比当前温度高。vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> stk;  // 栈,用来存储温度数组的索引。vector<int> ans(temperatures.size(), 0);  // 结果数组,初始值为0,大小与输入数组相同。// 遍历温度数组for (int i = 0; i < temperatures.size(); i++) {// 如果栈不为空且当前温度大于栈顶所对应的温度// 说明找到了栈顶温度的下一个较高温度,记录间隔天数并弹出栈顶元素。while (!stk.empty() && temperatures[i] > temperatures[stk.top()]) {ans[stk.top()] = i - stk.top();  // 计算天数差,更新结果数组。stk.pop();  // 弹出栈顶元素。}stk.push(i);  // 当前天的索引入栈,待后续天数比较。}return ans;  // 返回结果数组,包含每一天的等待天数。}
};
int main(int argc, char const *argv[])
{vector<int> temperatures={73,74,75,71,69,72,76,73};Solution2 s2;vector<int> ans=s2.dailyTemperatures(temperatures);for (auto &i : ans){cout<<i<<" ";}return 0;
}

LeetCode 热题 100_每日温度(72_739)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS Next之旅】DevEco Studio使用指南(二)

目录 1 -> 工程模板介绍 2 -> 创建一个新的工程 2.1 -> 创建和配置新工程 2.1.1 -> 创建HarmonyOS工程 2.2.2 -> 创建OpenHarmony工程 1 -> 工程模板介绍 DevEco Studio支持多种品类的应用/元服务开发&#xff0c;预置丰富的工程模板&#xff0c;可以根…

unity3d 背景是桌面3d数字人,前面是web的表单

是可以实现的&#xff0c;但涉及多个技术栈的结合&#xff0c;包括 Unity3D、Web 技术&#xff08;HTML、JavaScript&#xff09;、以及可能的 WebGL 或 WebRTC 技术。大致有以下几种实现方案&#xff1a; 方案 1&#xff1a;Unity 作为独立应用&#xff08;桌面端&#xff0…

猫耳大型活动提效——组件低代码化

1. 引言 猫耳前端在开发活动的过程中&#xff0c;经历过传统的 pro code 阶段&#xff0c;即活动页面完全由前端开发编码实现&#xff0c;直到 2020 年接入公司内部的低代码活动平台&#xff0c;满足了大部分日常活动的需求&#xff0c;运营可自主配置活动并上线&#xff0c;释…

深度学习系列79:Text2sql调研

参考 https://github.com/topics/text-to-sql 这里是一些资源&#xff1a;https://github.com/eosphoros-ai/Awesome-Text2SQL/blob/main/README.zh.md 这里是综述文章&#xff1a;https://zhuanlan.zhihu.com/p/647249972 1. 数据集 Spider: 一个跨域的复杂text2sql数据集&a…

Linux 系统负载过高的排查思路

技术探讨&#xff1a;Linux系统负载过高的排查思路 在Linux服务器运行过程中&#xff0c;如果系统负载过高&#xff0c;可能会导致性能下降和服务不稳定。以下是针对Linux系统负载过高问题的排查思路和解决方法&#xff1a; 1. 查看系统负载&#xff1a; 使用uptime或top命令查…

【互联网性能指标】QPS/TPS/PV/UV/IP/GMV/DAU/MAU/RPS

&#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》&#xff08;基础篇&#xff09;、&#xff08;进阶篇&#xff09;、&#xff08;架构篇&#xff09;清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…

linux---天气爬虫

代码概述 这段代码实现了一个天气查询系统&#xff0c;支持实时天气、未来天气和历史天气查询。用户可以通过终端菜单选择查询类型&#xff0c;并输入城市名称来获取相应的天气信息。程序通过 TCP 连接发送 HTTP 请求&#xff0c;并解析返回的 JSON 数据来展示天气信息。 #in…

Java高频面试之集合-08

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;详细说说CopyOnWriteArrayList CopyOnWriteArrayList 详解 CopyOnWriteArrayList 是 Java 并发包&#xff08;java.util…

【微信小程序 onTabItemTap:精准监听 TabBar 点击事件】

onTabItemTap 是微信小程序中的一个页面生命周期函数&#xff0c;用于监听用户点击 TabBar 上的某个项时的事件。以下是如何运用 onTabItemTap 的详细说明&#xff1a; 使用场景 onTabItemTap 适用于需要在用户点击 TabBar 切换页面时执行特定逻辑的场景。例如&#xff0c;你…

痉挛性斜颈需要做手术吗?

痉挛性斜颈的治疗是一个涉及多种医学知识的话题&#xff0c;让我们从多方面分析这个问题&#xff0c;来谈谈是否需要进行手术。 首先&#xff0c;我们要明确痉挛性斜颈是一种什么疾病。痉挛性斜颈是一种颈部肌肉异常收缩的疾病&#xff0c;可能导致头部持续或间歇性地向一侧旋…

AOT是什么?

https://www.bilibili.com/video/BV1Es4y1q7Bf?spm_id_from333.788.player.switch&vd_source12d5954938d20d50645e227a6a728c76&p87常规的java代码是即时解释执行的&#xff0c;只有热点代码才会提前编译成二进制&#xff0c;并且将java代码放到别的电脑执行时得安装j…

【JavaWeb学习Day23】

Maven高级 分模块设计与开发 分模块设计&#xff1a;将一个大项目分成若干个子模块&#xff0c;方便项目的维护、扩展&#xff0c;也方便模块间的相互引用&#xff0c;资源共享。 策略&#xff1a; 1.策略一&#xff1a;按照功能模块拆分&#xff0c;比如&#xff1a;公共组…

图像的特征

图像的特征主要包括以下几类&#xff1a; 1. 颜色特征&#xff1a; 直方图&#xff1a;描述图像中颜色的分布。 颜色矩&#xff1a;通过颜色的均值、方差等统计量表示颜色分布。 主色调&#xff1a;图像中占主导地位的颜色。 2. 纹理特征&#xff1a; 灰度共生矩阵&#xff0…

⭐LeetCode周赛 3468. 可行数组的数目——暴力与数学⭐

⭐LeetCode周赛 3468. 可行数组的数目——暴力与数学⭐ 示例 1&#xff1a; 输入&#xff1a;original [1,2,3,4], bounds [[1,2],[2,3],[3,4],[4,5]] 输出&#xff1a;2 解释&#xff1a; 可能的数组为&#xff1a; [1, 2, 3, 4] [2, 3, 4, 5] 示例 2&#xff1a; 输入&…

AF3 squeeze_features函数解读

AlphaFold3 data_transforms 模块的 squeeze_features 函数的作用去除 蛋白质特征张量中不必要的单维度&#xff08;singleton dimensions&#xff09;和重复维度&#xff0c;以使其适配 AlphaFold3 预期的输入格式。 源代码&#xff1a; def squeeze_features(protein):&qu…

【打卡d4】日期类--分组输入

第一题&#xff1a;根据一年中的第 n 天计算日期 &#x1f4cc; 知识点 判断闰年&#xff1a; 闰年条件&#xff1a;能被 400 整除&#xff0c;或 能被 4 整除但不能被 100 整除。平年&#xff1a;2 月 28 天&#xff1b;闰年&#xff1a;2 月 29 天。 累加月份&#xff0c;找…

JAVA(5)-基础概念

*固定格式 一.注释和关键字 关键字&#xff1a;被赋予特定关系的词 字母全部小写&#xff0c;如class表示一个类 二.字面量 1.字面量类型 *字符串里面的类型是一句话&#xff0c;用双引号 字符里面的类型只有一个字或字母 null只能用字符串的方式打印 2.制表符 \t 至少补…

本地部署Navidrome个人云音乐平台随时随地畅听本地音乐文件

文章目录 前言1. 安装Docker2. 创建并启动Navidrome容器3. 公网远程访问本地Navidrome3.1 内网穿透工具安装3.2 创建远程连接公网地址3.3 使用固定公网地址远程访问 前言 今天我要给大家安利一个超酷的私有化音乐神器——Navidrome&#xff01;它不仅让你随时随地畅享本地音乐…

C++ 中的RAII(资源获取及初始化)

C 中的RAII(资源获取即初始化) RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是C中一种重要的编程范式&#xff0c;全称为“资源获取即初始化”。它是一种通过对象生命周期管理资源&#xff08;如内存、文件句柄、网络连接等&#xff09;的技术&#x…

蓝桥杯嵌入式组第七届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之&#xff0c;藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 ADC模块1.3.3 IIC模块1.3.4 UART模块1.3.5 LCD模块1.3.6 LED模块1.3.7 TIM模块 2.源码3.第七届题目 前言&#xff1a;STM32G431RBT6实现嵌入式组第七届题目解析源码&…