一.题目
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;
}