LeetCode解题方法7-栈

本文介绍使用栈解决LeetCode 739题——每日温度的算法思路。针对给定的每日气温列表,通过栈来寻找每个温度右侧最近的比其高的温度,从而计算出温度升高的等待天数。文章详细解释了栈操作的具体步骤,包括如何判断、入栈和出栈,最终生成所需的结果列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.题目

739.每日温度

二.思路

用栈来解决问题。

三.739题的解法

题目:
根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/daily-temperatures
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题方法:
该题用栈解决。
目的是找到k点右侧最近的比自己大的温度。现在用栈保存比自己大的温度,以及位置。
创建一个栈,从最右一个元素开始判断:
1.如果栈为空,则判断右侧没有大于自己的温度。
2.如果栈不为空:
2.1如果栈顶小于等于自己,则将该元素删除。并继续判断栈是否为空。如果直到栈变为空也没有大于自己的温度,则判断右侧没有大于自己的温度。
2.2如果栈顶元素大于自己,则该元素是要找的元素。
判断完成后,将本身入栈,并继续判断左面的元素。
代码:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
typedef struct {
    int temp;
    int pos;
} DataStru;
#define MAXLEN 71
typedef struct {
    DataStru* data[MAXLEN];
    int topIndex;
} StackStru;
int STACK_IsFull(StackStru *s)
{
    if (s->topIndex == MAXLEN) {
        return 0;
    }
    return -1;
}
int STACK_IsEmpty(StackStru *s)
{
    if (s->topIndex == 0) {
        return 0;
    }
    return -1;
}
int STACK_Push(StackStru *s, int temp, int pos)
{
    if (STACK_IsFull(s) == 0) {
        return -1;
    }
    s->data[s->topIndex] = (DataStru*)malloc(sizeof(DataStru));
    s->data[s->topIndex]->temp = temp;
    s->data[s->topIndex]->pos = pos;
    (s->topIndex)++;
    return 0;
}
int STACK_Pop(StackStru *s, DataStru* data)
{
    if (STACK_IsEmpty(s) == 0) {
        return -1;
    }
    (s->topIndex)--;
    data->temp = s->data[s->topIndex]->temp;
    data->pos = s->data[s->topIndex]->pos;
    free(s->data[s->topIndex]);
    return 0;
}
int* dailyTemperatures(int* T, int TSize, int* returnSize){
    StackStru stack;
    DataStru data;
    stack.topIndex = 0;
    int i;
    int* out;
    (*returnSize) = TSize;
    if (TSize == 0) {
        return 0;
    }
    out = (int*)malloc(sizeof(int) * TSize);
    for (i = TSize - 1; i >= 0; i--) {
        out[i] = 0;
        while (STACK_Pop(&stack, &data) == 0) {
            if (data.temp > T[i]) {
                out[i] = data.pos - i;                
                STACK_Push(&stack, data.temp, data.pos);
                break;
            }
        }
        STACK_Push(&stack, T[i], i);
    }
    return out;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值