LeetCode 算法:每日温度 c++

题目

给定一个整数数组 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. 解题思路

LeetCode 上的 “每日温度”(Daily Temperatures)问题是一个很好的练习数组和栈结构的题目。题目描述如下:

给定一个整数数组 T,表示每天的温度。返回一个数组,其中包含每个日子之后的第一个更高温度的索引(以天为单位)。如果在未来没有更高的温度,则为 0

这个问题可以通过使用栈来解决,栈用于存储当前还没有找到更高温度的日子的索引。下面是解题思路的步骤:

  1. 初始化:创建一个结果数组 res,长度与输入数组 T 相同,并将所有元素初始化为 0。这表示如果没有找到更高的温度,就默认为 0

  2. 栈的使用:使用一个栈来存储索引。栈中的元素应该是按顺序排列的,即栈底的元素对应的日子是最早的。

  3. 遍历数组:从左到右遍历数组 T,对于每个元素(即每天的温度):

    • 如果栈为空,或者当前温度高于栈顶元素对应的温度,则继续遍历,栈不做任何操作。
    • 如果当前温度低于或等于栈顶元素对应的温度,那么弹出栈顶元素,直到找到一个对应温度更高的元素或者栈为空。
  4. 更新结果:每当从栈中弹出一个元素时,就找到了一个更高温度的日子。此时,更新结果数组 res 中相应索引的值为当前遍历到的索引加一(因为索引是从0开始的)。

  5. 继续遍历:将当前索引压入栈中,继续遍历下一个元素。

  6. 完成遍历:遍历完成后,栈中剩余的元素对应的结果数组 res 的值应该保持为 0,因为它们之后没有更高温度的日子。

  7. 返回结果:返回结果数组 res

  1. c++ demo
#include <iostream>
#include <vector>
#include <stack>

using namespace std;

vector<int> dailyTemperatures(vector<int>& T) {
    vector<int> result(T.size(), 0); // 初始化结果数组
    stack<int> indices; // 使用栈存储索引

    for (int i = 0; i < T.size(); ++i) {
        // 当栈不为空且当前温度大于栈顶元素对应的温度
        while (!indices.empty() && T[i] > T[indices.top()]) {
            // 弹出栈顶元素,并计算距离
            int prevIndex = indices.top();
            indices.pop();
            result[prevIndex] = i - prevIndex;
        }
        // 将当前索引压入栈中
        indices.push(i);
    }

    return result;
}

int main() {
    // 测试用例1
    vector<int> T1 = { 73, 74, 75, 71, 69, 72, 76, 73 };
    vector<int> result1 = dailyTemperatures(T1);
    for (int i : result1) {
        cout << i << " ";
    }
    cout << endl;

    // 测试用例2
    vector<int> T2 = { 30, 40, 50, 60 };
    vector<int> result2 = dailyTemperatures(T2);
    for (int i : result2) {
        cout << i << " ";
    }
    cout << endl;

    // 测试用例3
    vector<int> T3 = { 30, 60, 90 };
    vector<int> result3 = dailyTemperatures(T3);
    for (int i : result3) {
        cout << i << " ";
    }
    cout << endl;

    return 0;
}
  • 输出结果:

1 1 4 2 1 1 0 0
1 1 1 0
1 1 0

  1. 代码仓库地址dailyTemperatures
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码流怪侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值