数据结构考点:栈
题目描述:
给定一个整数数组 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] |
详细解答:
解答一:一种会超时的简单算法,不用"栈"
cpp
int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize) {
int *result,flag;
result = (int*)malloc(sizeof(int) * temperaturesSize);
returnSize = (int*)malloc(sizeof(int));
*returnSize = temperaturesSize;
for (int i = 0; i < temperaturesSize;i++)
{
flag = 0;
int t = temperatures[i];
for (int j = 1; j <= temperaturesSize-1-i;j++)
{
if(t<temperatures[i+j])
{
result[i] = j;
flag = 1;
break;
}
}
if(flag==0)
result[i] = 0;
}
return result;
}
解法二:利用"栈"
(由于题目来源于Leetcode,所以没有主函数)
该程序以C语言为主,利用了C++的一些函数:(但是不可以再Leetcode提交)
cpp
#include<stdio.h>
#include<iostream>
#include<stack>
#include<stdc++.h>
using namespace std;
int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize) {
int *result;
result = (int*)malloc(sizeof(int) * temperaturesSize);
memset(result, 0, sizeof(int) * temperaturesSize);
*returnSize = temperaturesSize;
stack<int> sta;
sta.push(0);
int i, j;
for (i = 1;i<temperaturesSize;i++)
{
if(temperatures[sta.top()]<temperatures[i])
{
while(!sta.empty()&&temperatures[sta.top()]<temperatures[i])
{
result[sta.top()] = i - sta.top();
sta.pop();
}
sta.push(i);
}
else
{
sta.push(i);
}
}
return result;
}
解法三:C++
cpp
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> result(temperatures.size(), 0);
stack<int> sta;
sta.push(0);
int i, j;
for (i = 1;i<temperatures.size();i++)
{
if(temperatures[sta.top()]<temperatures[i])
{
while(!sta.empty()&&temperatures[sta.top()]<temperatures[i])
{
result[sta.top()] = i - sta.top();
sta.pop();
}
sta.push(i);
}
else
{
sta.push(i);
}
}
return result;
}
};
题目来源:Leetcode739.【 739. 每日温度 - 力扣(LeetCode)】